首页 > 编程问答 >如何反转“dataclass.astuple”?

如何反转“dataclass.astuple”?

时间:2024-07-26 07:36:37浏览次数:8  
标签:python factory python-dataclasses

我正在尝试从元组构造 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 函数。最后,函数使用字典解包将元组元素转换为数据类的属性,并返回创建的数据类对象。

优点:

  • 递归地处理嵌套数据类。
  • 代码简洁易懂。

缺点:

  • 如果数据类结构复杂,代码可能会变得冗长。

标签:python,factory,python-dataclasses
From: 78795749

相关文章