既然 Python 3.10 已经发布,那么在指示参数或返回值可能是可选的(即可以是None
. 那么什么是首选:
选项1:
def f(parameter: Optional[int]) -> Optional[str]:
选项 2:
def f(parameter: int | None) -> str | None:
Type | None
另外,和之间有什么偏好None | Type
吗?
既然 Python 3.10 已经发布,那么在指示参数或返回值可能是可选的(即可以是None
. 那么什么是首选:
选项1:
def f(parameter: Optional[int]) -> Optional[str]:
选项 2:
def f(parameter: int | None) -> str | None:
Type | None
另外,和之间有什么偏好None | Type
吗?
PEP 604在规范部分涵盖了这些主题。
现有的
typing.Union
和|
语法应该是等价的。int | str == typing.Union[int, str]
联盟中项目的顺序对平等无关紧要。
(int | str) == (str | int) (int | str | float) == typing.Union[str, float, int]
可选值应该等同于新的联合语法
None | t == typing.Optional[t]
正如@jonrsharpe 注释,Union
并且Optional
不被弃用,所以Union
and|
语法是可以接受的。
Python 核心开发人员Łukasz Langa在 YouTube 直播中回答了与 Python 3.10 版本相关的问题,该版本Type | None
比Optional[Type]
Python 3.10+ 更受欢迎。
我个人会选择选项 2。
此外,只是想添加它以提高意识,但 Python 3.7+ 可以使用__future__
导入来支持这种语法,如下所示。这种类型的检查是一样的;实际上,我从我目前正在使用的 Pycharm 的最新发行说明中得到了提示。
from __future__ import annotations
def f(parameter: int | None) -> str | None:
...
非权威,但我希望Optional
何时
None
)None
调用者通过是不寻常的虽然我希望一些Union
or|
会在什么时候使用
None
None
也是一个有效值