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

Posted

技术标签:

【中文标题】Python 3.10+:可选[类型] 或类型 |没有【英文标题】:Python 3.10+: Optional[Type] or Type | None 【发布时间】: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 以支持新语法,所以这取决于您。 【参考方案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 comments、UnionOptional 未被弃用,因此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 何时

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

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

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

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

【讨论】:

以上是关于Python 3.10+:可选[类型] 或类型 |没有的主要内容,如果未能解决你的问题,请参考以下文章

Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性

是否有带有可选类型提示的 OOP 语言?

Python 3.10 有哪些新特性 ?

Python 3.10 有哪些最新特性 ?

Swift的可选链,类型转换和扩展

Python函数:函数的定义语法调用参数类型(必选参数缺省参数可选参数关键字可选参数)return返回值函数嵌套