【问题标题】:Python 3.10+: Optional[Type] or Type | NonePython 3.10+:可选[类型] 或类型 |没有
【发布时间】:2021-11-25 03:28:47
【问题描述】:

现在 Python 3.10 已经发布了,当指示参数或返回值可能是可选的时,是否有任何偏好,即可以是None。那么什么是首选:

选项 1:

def f(parameter: Optional[int]) -> Optional[str]:

选项 2:

def f(parameter: int | None) -> str | None:

另外,Type | NoneNone | Type 之间有什么偏好吗?

【问题讨论】:

  • 3.10 文档不会弃用 Union 或 Optional 以支持新语法,所以这取决于您。

标签: python type-hinting mypy python-typing python-3.10


【解决方案1】:

PEP 604 在规范部分涵盖了这些主题。

现有的typing.Union| 语法应该是等价的。

int | str == typing.Union[int, str]

Union 中项目的顺序对于相等性无关紧要。

(int | str) == (str | int)
(int | str | float) == typing.Union[str, float, int]

可选值应该等同于新的联合语法

None | t == typing.Optional[t]

由于@jonrsharpe commentsUnionOptional 未被弃用,因此Union| 语法是可以接受的。


Python 核心开发人员Łukasz Langa 在与 Python 3.10 版本相关的 YouTube 直播中回复说,对于 Python 3.10+,Type | None 优于 Optional[Type]

【讨论】:

  • 感谢您的回答。我通过 YouTube 直播提出了这个问题,Lukas Langa 回复说Type | None 现在是 Python 3.10 的首选方式。如果您不介意,我可以在屏幕截图中将此添加到您的答案中。
  • @lmiguelvargasf - 没问题
  • @Imiguelvargasf 他会说——他写了 PEP ;) 这只是个人喜好 imo 的问题,尽管我个人想不出我会发现旧语法更清晰的情况或更具可读性。另一方面,它更向后兼容!
  • @AlexWaygood - 我没有看到 Lukasz Langa 的名字。你确定是他写的?
  • @jakub 我的错!看起来我把 PEP 585 和 PEP 604 搞混了。感谢您的指正。输入 PEP 太多、时间太少等
【解决方案2】:

我个人会选择 选项 2 继续前进。

另外,只是想添加它以提高意识,但 Python 3.7+ 可以使用 __future__ 导入来支持这种语法,如下所示。这种类型的检查是一样的;我实际上是从我目前正在使用的 Pycharm 的最新发行说明中得到提示的。

from __future__ import annotations


def f(parameter: int | None) -> str | None:
    ...

【讨论】:

    【解决方案3】:

    非权威,但我希望 Optional 何时

    • 提供了一个默认值(可能是None
    • None 对于调用者来说是不寻常的

    虽然我希望在何时使用一些 Union|

    • 没有默认值和/或默认值是不是 None
    • None 也是一个有效值

    How do I add default parameters to functions when using type hinting?查看相关建议

    【讨论】:

      猜你喜欢
      • 2020-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-14
      • 2022-09-24
      • 2018-08-20
      • 1970-01-01
      相关资源
      最近更新 更多