7

既然 Python 3.10 已经发布,那么在指示参数或返回值可能是可选的(即可以是None. 那么什么是首选:

选项1:

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

选项 2:

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

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

4

3 回答 3

12

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不被弃用,所以Unionand|语法是可以接受的。


Python 核心开发人员Łukasz Langa在 YouTube 直播中回答了与 Python 3.10 版本相关的问题,该版本Type | NoneOptional[Type]Python 3.10+ 更受欢迎。

在此处输入图像描述

于 2021-10-04T18:15:03.350 回答
6

我个人会选择选项 2

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

from __future__ import annotations


def f(parameter: int | None) -> str | None:
    ...
于 2021-10-04T18:18:20.947 回答
0

非权威,但我希望Optional何时

  • 提供了一个默认值(可能None
  • None调用者通过是不寻常的

虽然我希望一些Unionor|会在什么时候使用

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

请参阅如何在使用类型提示时向函数添加默认参数?

于 2021-10-04T18:15:10.070 回答