【发布时间】:2019-11-26 13:57:51
【问题描述】:
我想为一个数据类创建一个字典,其中包含作为属性的数据类列表
这是我想要实现的示例:
from typing import List
from dataclasses import dataclass
@dataclass
class level2:
key21: int
key22: int
@nested_dataclass
class level1:
key1: int
key2: List[level2]
data = {
'key1': value1,
'key2': [{
'key21': value21,
'key22': value22,
}]
}
my_object = level1(**data)
print(my_object.key2[0].key21) #should print value21
我发现最近的装饰器是这个,但它不适用于数据类列表: Creating nested dataclass objects in Python
def is_dataclass(obj):
"""Returns True if obj is a dataclass or an instance of a
dataclass."""
_FIELDS = '__dataclass_fields__'
return hasattr(obj, _FIELDS)
def nested_dataclass(*args, **kwargs):
def wrapper(cls):
cls = dataclass(cls, **kwargs)
original_init = cls.__init__
def __init__(self, *args, **kwargs):
for name, value in kwargs.items():
field_type = cls.__annotations__.get(name, None)
if is_dataclass(field_type) and isinstance(value, dict):
new_obj = field_type(**value)
kwargs[name] = new_obj
original_init(self, *args, **kwargs)
cls.__init__ = __init__
return cls
return wrapper(args[0]) if args else wrapper
您将如何修改此装饰器或创建一个可以完成这项工作的装饰器? (我在建筑装饰师方面的经验为零)
非常感谢任何评论/代码。谢谢
【问题讨论】:
-
key2 应该是一个列表吧?我不认为你的
data声明是正确的 -
对,正在修改帖子,谢谢指出
标签: python list nested decorator python-dataclasses