如何处理在数据类的__post_init__()期间初始化的成员变量的类型



下面的变量初始化为none,但在__post_init__期间,它被替换为outlook客户端实例

@dataclass
class Config:
"""Outlook configuration"""
mailbox: str
inbox: str
mailbox_obj: Union["Mailbox", None] = None

然而,静态类型分析正确地告知mailbox_obj没有成员(…)不是"none"的已知成员。我不想用if mailbox_obj来保护所有东西只是为了满足类型分析。是否有其他方法使用数据类字段或其他东西?

如果我只使用常规类,问题就会消失,因为我可以在init中初始化问题变量其中类型将被推断为它的设置值,但是我必须编写额外的样板文件。

写这个问题让我想起了下面的东西,这可能就是我想要的:

mailbox_obj: "Mailbox" = field(init=False)

这是正确的方式吗?

是的,您想指定它不是init字段,所以您只需要像这样:

import dataclasses
class Mailbox:
pass
@dataclasses.dataclass
class Config:
"""Outlook configuration"""
mailbox: str
inbox: str
mailbox_obj: "Mailbox" = dataclasses.field(init=False)
def __post_init__(self):
# do some stuff...
self.mailbox_obj = Mailbox()

我将上面的代码保存在一个名为test_typing.py的文件中,这里是mypy:

(py310) Juans-MBP:test juan$ mypy test_typing.py
Success: no issues found in 1 source file

最新更新