如何使用类型提示指定 "nullable" return 类型

How to specify "nullable" return type with type hints

假设我有一个函数:

def get_some_date(some_argument: int=None) -> %datetime_or_None%:
    if some_argument is not None and some_argument == 1:
        return datetime.utcnow()
    else:
        return None

如何为可以是 None 的内容指定 return 类型?

您正在寻找 Optional

由于您的 return 类型可以是 datetime(从 datetime.utcnow() 编辑的 return)或 None,您应该使用 Optional[datetime] :

from typing import Optional

def get_some_date(some_argument: int=None) -> Optional[datetime]:
    # as defined

根据有关打字的文档,Optional 是 shorthand 用于:

Optional[X] is equivalent to Union[X, None].

其中 Union[X, Y] 表示 XY.

类型的值

如果你因为担心其他人可能会偶然发现 Optional 而没有意识到它的含义而想要明确,你总是可以使用 Union:

from typing import Union

def get_some_date(some_argument: int=None) -> Union[datetime, None]:

但我怀疑这是个好主意,Optional 是一个指示性名称,它确实节省了几次击键。

正如@Michael0x2a 在评论中指出的那样,Union[T, None] 已转换为 Union[T, type(None)],因此无需在此处使用 type

在视觉上这些可能不同,但在编程上,在这两种情况下,结果 完全相同Union[datetime.datetime, NoneType] 将是存储在 get_some_date.__annotations__*:

中的类型
>>> from typing import get_type_hints
>>> print(get_type_hints(get_some_date))
{'return': typing.Union[datetime.datetime, NoneType],
 'some_argument': typing.Union[int, NoneType]}

*使用typing.get_type_hints获取对象的__annotations__属性而不是直接访问它。

您可以只使用垂直线 datetime | None(类似于 OR 运算符):

def get_some_date(some_argument: int=None) -> datetime | None:
   # rest of code