Python dataclass列表类变量加类型注解才报可变错误是否为预期行为?
问题解答
这个表现是Python dataclass的设计规定,属于完全预期的行为,核心原因和dataclass的字段识别规则、校验逻辑有关:
- dataclass仅会将带类型注解的类属性识别为需要处理的字段。没有类型注解的类属性会被判定为普通类变量,dataclass的装饰器逻辑不会对其做任何额外处理。
- 当属性被识别为dataclass字段时,装饰器会自动做可变默认值校验:如果给
list、dict、set这类可变类型直接赋值作为默认值,为了避免多实例共享可变对象的潜在bug,就会主动抛出ValueError,要求你使用default_factory生成每个实例独有的初始可变对象,正确写法示例如下:
from dataclasses import dataclass, field @dataclass class A: a: list = field(default_factory=list) def __init__(self): self.b = 1
- 去掉类型注解后,
a不会被识别为dataclass字段,自然不会触发上述校验逻辑,它的行为和普通类中定义的类变量完全一致,会被所有类实例共享。
该逻辑在所有支持dataclass的Python版本(3.7及以上)中均生效,与你使用的3.7.6版本无关。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

