如何使用类型提示指定“可空”返回类型

时间:2016-09-10 18:56:50

标签: python python-3.x python-3.5 type-hinting

假设我有一个功能:

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

指定某些内容的返回类型

1 个答案:

答案 0 :(得分:154)

您正在寻找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]表示类型为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__属性,而不是直接访问它。