299

假设我有一个功能:

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

4

2 回答 2

477

你正在寻找Optional.

由于您的返回类型可以是datetime(从返回datetime.utcnow())或者None您应该使用Optional[datetime]

from typing import Optional

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

从有关打字的文档中,Optional它是以下的简写:

Optional[X]相当于Union[X, None]

其中Union[X, Y]表示类型X或的值Y


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__属性,而不是直接访问它。

于 2016-09-10T19:03:06.617 回答
3

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

def get_some_date(some_argument: int=None) -> datetime | None:
   # rest of code
于 2021-12-08T22:38:32.200 回答