各位同事,我在学习中dataclasses,遇到一个无法理解/实现的点。
一般信息。
如果不使用库本身的对象,就dataclasses不可能直接创建可变类型的类属性dataclasses。为什么这样做在文档中有描述,我也找到了;同事们正在详细讨论这个问题。但借助方法dataclasses还是可以做到的。
以下是不该做的事情的典型示例:
@dataclass
class Foo:
bar: list = []
它将发生在这里ValueError
但这是你可以(应该!):
@dataclass
class Foo:
bar: list = field(default_factory=list)
在本例中,创建了 type 的属性List,但未分配默认值。文档没有描述如何在定义类时立即分配可变类型的默认值,但同事建议:
@dataclass
class Foo:
bar: list = field(default_factory=lambda: [1, 2, 3])
问题。
有dataclasses一种方法.make_dataclass()可以动态定义数据类;它不需要提前定义。一般来说,我也很清楚它是如何工作的,但为可变类型的变量分配默认值是一个问题。我尝试了不同的方式,得到了不同类型的异常。
例如:
from dataclasses import make_dataclass, field
Config = make_dataclass('Config', [('x', field(default_factory=lambda: [1,2,3]))])
config = Config()
print(config.x)
在实例化创建时config = Config()会引发异常:
类型错误:Config.__init__() 缺少 1 个必需的位置参数:'x'
也就是说,我们创建了属性,但没有分配值。如果删除,会发生完全相同的事情lambda:创建类时没有错误,创建属性,但忽略默认值。
问题
如何使用具有可变类型属性的dataclass方法进行创建,该属性将立即被分配默认值。.make_dataclass()这原则上可能吗?
你没有指定类型
此外。这是一个实现
def make_dataclass(),您可以特别看到如何fields根据每个元组中的值的数量(可以是 1 到 3)来解析参数。观察。您
typing.Any可以使用None。任何类型和不同类型的常量都可以工作:)