不允许 Python 类型提示 Dict 语法错误可变默认值。使用“默认工厂”

cha*_*ory 5 python python-3.x

我不确定为什么口译员会抱怨这个输入的 Dict。对于这两个实例,我都收到“不允许使用可变默认值。使用默认工厂”语法错误。我正在使用 python 3.7.3

from dataclasses import dataclass
from typing import Dict

@dataclass
class Test:
    foo: Dict[str, int] = {}
    bar: Dict[str, float] = {'blah': 2.0}
Run Code Online (Sandbox Code Playgroud)

弄清楚了。这是导致问题的@dataclass 注释。有人能告诉我为什么吗?

小智 11

是的,这是dataclass为了避免您意外地为每个使用默认值实例化的 Test 对象提供相同的字典。

您可以调整上述内容以提供默认工厂(每次需要默认值时创建一个字典的函数),其中包含以下内容:

from dataclasses import dataclass, field
from typing import Dict

@dataclass
class Test:
    foo: Dict[str, int] = field(default_factory=dict)
    bar: Dict[str, float] = field(default_factory=lambda: {'blah': 2.0})
Run Code Online (Sandbox Code Playgroud)

  • 还有其他更简单的方法来解决这个问题吗?我正在尝试使用数据类来制作一些可编辑的配置文件,这种方法使所有内容都无法使用 - 线路噪音太多。 (5认同)
  • 我无法停止对 Python 如此混乱的程度感到惊讶。运行时错误本身令人困惑:我正在使用数据类装饰器,并且我确实_被迫_看到**运行时**提醒属性是静态的!那么为什么数据类装饰器默认不提供默认工厂呢?如果这是故意的怎么办?好悲伤。 (4认同)
  • 因为当您在一个实例中修改它时,它也会在所有其他实例中修改。 (4认同)