Python 3.10+:可选[类型] 或类型 | None

Python 3.10+: Optional[Type] or Type | None

既然Python3.10已经发布,在表示参数或返回值可能是可选的,即可以是None时,有什么偏好吗?那么首选:

选项 1:

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

选项 2:

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

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

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

The existing typing.Union and | syntax should be equivalent.

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

The order of the items in the Union should not matter for equality.

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

Optional values should be equivalent to the new union syntax

None | t == typing.Optional[t]

由于 UnionOptional 未弃用,因此 Union| 语法是可以接受的。


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

非权威性,但我希望 Optional

  • 提供了默认值(可能None
  • None 调用者传递
  • 是不正常的

虽然我希望在

时使用一些 Union|
  • 没有默认值and/or默认是没有None
  • None也是一个有效值

查看相关建议

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

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

from __future__ import annotations


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