【问题标题】:Can I use the Union and Optional types from the typing module when creating a dataclass?创建数据类时,我可以使用类型模块中的 Union 和 Optional 类型吗?
【发布时间】:2019-08-23 15:14:00
【问题描述】:

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

例如:

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

【问题讨论】:

  • Annotations can be any python expression。 “安全”是什么意思?
  • dataclasses模块的文档和网上各种教程只使用了“简单”类型,如strfloatint、SomeClass、Any
  • 附带说明,如果您想验证您的类型提示是否正确,您应该使用类型检查器,例如 mypypyrepyright

标签: python-3.x python-dataclasses


【解决方案1】:

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

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

因此,您应该使用一种您的工具可以很好地使用的注释,并且根据我的个人经验,这意味着使用来自typing 模块的类型注释而不是基本类型。


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

我假设数据类文档使用基本的 Python 类型,以免给读者带来太多的知识负担。毕竟,您可以很好地使用数据类,而无需对typing 模块一无所知,一旦您对数据类的工作方式感到满意,您可能会遇到并欣赏使用typing 注释的额外功能.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2010-10-13
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    相关资源
    最近更新 更多