在 __post_init__ 中设置可选数据类参数时如何避免检查 None

Met*_*lis 5 type-hinting python-3.x 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 = []
Run Code Online (Sandbox Code Playgroud)

这按预期工作。items然而,每当我在此类的某些实例中引用时,mypy 都会警告该items值可能为 None。例如:

c = ClassWithState("object name")
c.items.append("item1")
Run Code Online (Sandbox Code Playgroud)

MyPy 会抱怨类似以下内容:

“Optional[List[str]]”的项目“None”没有属性“append”。

我不想每次提到时都添加不必要的检查,items例如

assert c.items is not None
Run Code Online (Sandbox Code Playgroud)

我提到的到处都是items。我怎样才能说服mypyitems永远不会是None?

Car*_*ate 4

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=[])
Run Code Online (Sandbox Code Playgroud)