我正在尝试从元组构造
dataclass
es 的层次结构,如下所示:
from dataclasses import astuple, dataclass
@dataclass
class Child:
name: str
@dataclass
class Parent:
child: Child
# this is what I want
p = Parent(Child("Tim"))
print(p)
# this is what I get
t = astuple(p)
print(Parent(*t))
但是,虽然这按预期构造了
Parent
,但它的
child
不是类型
Child
:
Parent(child=Child(name='Tim'))
Parent(child=('Tim',))
Is有没有办法从元组
或通过其他方式构造Parent
和child
t
?
可以使用
dataclass
装饰器的
asdict
方法将数据类转换为字典,然后递归地将元组转换回数据类。
以下是代码示例:
from dataclasses import astuple, dataclass, asdict
@dataclass
class Child:
name: str
@dataclass
class Parent:
child: Child
def from_tuple(dataclass, t):
"""递归地将元组转换为数据类"""
if isinstance(t, tuple) and hasattr(dataclass, '_fields'):
return dataclass(**{
field: from_tuple(field_type, t[i])
for i, (field, field_type) in enumerate(dataclass.__annotations__.items())
})
else:
return t
# 将 Parent 对象转换为元组
p = Parent(Child("Tim"))
t = astuple(p)
# 从元组构造 Parent 对象
p2 = from_tuple(Parent, t)
print(p2) # 输出: Parent(child=Child(name='Tim'))
这段代码定义了一个
from_tuple
函数,它接受一个数据类和一个元组作为参数。函数首先检查元组的每个元素是否也是元组,如果是,则递归调用
from_tuple
函数。最后,函数使用字典解包将元组元素转换为数据类的属性,并返回创建的数据类对象。
优点:
- 递归地处理嵌套数据类。
- 代码简洁易懂。
缺点:
- 如果数据类结构复杂,代码可能会变得冗长。