将默认列表参数传递给数据类



我想在我的类中传递默认参数, 但不知何故我遇到了问题:

from dataclasses import dataclass, field
from typing import List
@dataclass
class Pizza():
ingredients: List = field(default_factory=['dow', 'tomatoes'])
meat: str = field(default='chicken')
def __repr__(self):
return 'preparing_following_pizza {} {}'.format(self.ingredients, self.meat)

如果我现在尝试实例化Pizza,则会出现以下错误:

>>> my_order = Pizza()
Traceback (most recent call last):
File "pizza.py", line 13, in <module>
Pizza()
File "<string>", line 2, in __init__
TypeError: 'list' object is not callable

我做错了什么?

来自dataclasses.field文档:

field()的参数包括:

  • default_factory:如果提供,它必须是零参数可调用的 当此字段需要默认值时,将调用。中 其他目的,这可用于指定具有可变性的字段 默认值,如下所述。同时指定两者是错误的 默认值和default_factory。

您的default_factory不是可调用的 0 参数,而是一个列表,这就是错误的原因:

from dataclasses import dataclass, field
from typing import List
@dataclass
class Pizza():
ingredients: List = field(default_factory=['dow', 'tomatoes'])  # <- wrong!

请改用 lambda 函数:

@dataclass
class Pizza():
ingredients: List = field(default_factory=lambda: ['dow', 'tomatoes'])

对于复杂的数据类型,我倾向于这样缩写:

import copy
from dataclasses import dataclass, field
from typing import Dict, Tuple
def default_field(obj):
return field(default_factory=lambda: copy.copy(obj))
@dataclass
class C:
complex_attribute: Dict[str, Tuple[int, str]] = default_field({"a": (1, "x"), "b": (1, "y")})

最新更新