首页 文章

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

提问于
浏览
68

假设我有一个功能:

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 回答

  • 109

    你在找Optional .

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

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

    从有关输入的文档中, 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)],因此不需要在这里使用类型 .

    在视觉上这些可能会有所不同,但在编程上,在两种情况下,结果完全相同; 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__ 属性,而不是直接访问它 .

相关问题