创建数据类时,我可以使用 typing 模块中的 Union 和 Optional 类型吗?

Can I use the Union and Optional types from the typing module when creating a dataclass?

我想在创建数据类时使用 UnionOptional 类型。 我可以安全地使用这些类型吗?

例如:

@dataclass
class Car:
    year: int
    owner: Optional[str]
    engine: Union[Engine1, Engine2]

是的,你可以。首先,python 中的注释本身不会做任何事情。在其他语言中,您可能认为将变量声明为 int 会导致错误,如果它被实例化为字符串,但在 python.[=19 中情况并非如此。 =]

注解仅供第三方库或工具使用,例如您的 IDE 当它给您提示时,或 mypy 当它对您的代码进行静态类型分析时。

所以你应该使用一种你的工具可以很好地工作的注释,根据我的个人经验,这意味着使用 typing 模块中的类型注释而不是基本类型。


虽然没有关于您必须使用什么的声明,here is a thread讨论了默认的数据类类型,包括 ericvsmith(数据类模块的作者)和 gvanrossum( python 的作者),他们同意 typing.Any 应该优于 object

我假设数据类文档使用基本的 python 类型,以免给 reader 带来太多的知识负担。毕竟,您可以在不了解 typing 模块的情况下很好地使用数据类,一旦您熟悉数据类的工作方式,您可能会 运行 并欣赏使用 typing的注释。