python-3.x - 在 __post_init__ 中设置可选数据类参数时如何避免检查 None

标签 python-3.x type-hinting mypy python-dataclasses

考虑一个参数具有可变默认值的数据类。为了能够使用新的默认值而不是共享的可变对象实例化对象,我们可以执行以下操作:

@dataclass
class ClassWithState:
    name: str
    items: Optional[List[str]] = None

    def __post_init__(self) -> None:
        if self.items is None:
            self.items = []
这按预期工作。然而,每当我提到items在此类的某些实例中,mypy 警告 items可能没有。例如:
c = ClassWithState("object name")
c.items.append("item1")
MyPy 会提示以下内容:

Item "None" of "Optional[List[str]]" has no attribute "append".


我不想每次引用 items 时都添加不必要的检查如
assert c.items is not None
到处都是我指的items .我怎样才能说服我的 friend items永远不会没有?

最佳答案

我会用 field default_factory选项集:

from dataclasses import dataclass, field
from typing import List


@dataclass
class ClassWithState:
    name: str
    items: List[str] = field(default_factory=list)

>>> ClassWithState("Hello")
ClassWithState(name='Hello', items=[])

关于python-3.x - 在 __post_init__ 中设置可选数据类参数时如何避免检查 None,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64670320/

相关文章:

python - 一种为类型检查目的子类化 NamedTuple 的方法

python - 如果我将默认设置为 None 可以省略 Optional 吗?

python - python3和python3m可执行文件之间的区别

Python 3 正则表达式查找多行注释

python - 如何为 Heroku 上部署的电报机器人编写定期重复的函数

python - 如何获得flask_sqlalchemy 类的PEP 484 类型提示?

python - 如何在 Python 中创建用户定义类型断言?

python - 关闭 'Python version 3.5 does not support variable annotations' 错误信息

python - 如何进行类型注释类型断言?

Python to EXE 构建一个空文件