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 | None
和None | 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]
由于 、Union
和 Optional
未弃用,因此 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:
...
既然Python3.10已经发布,在表示参数或返回值可能是可选的,即可以是None
时,有什么偏好吗?那么首选:
选项 1:
def f(parameter: Optional[int]) -> Optional[str]:
选项 2:
def f(parameter: int | None) -> str | None:
另外,Type | None
和None | 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]
由于 Union
和 Optional
未弃用,因此 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:
...