假设我有一个功能:
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 的返回类型?
None
你在找Optional .
由于您的返回类型可以是 datetime (从 datetime.utcnow() 返回)或 None ,您应该使用 Optional[datetime] :
datetime
datetime.utcnow()
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 类型的值 .
Union[X, Y]
X
Y
如果由于担心其他人可能会在 Optional 上发现并且没有意识到它的含义而想要明确,那么你总是可以使用 Union :
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__ *中存储的类型:
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__ 属性,而不是直接访问它 .
typing.get_type_hints
__annotations__
1 回答
你在找Optional .
由于您的返回类型可以是
datetime
(从datetime.utcnow()
返回)或None
,您应该使用Optional[datetime]
:从有关输入的文档中,
Optional
是以下的简写:其中
Union[X, Y]
表示X
或Y
类型的值 .如果由于担心其他人可能会在
Optional
上发现并且没有意识到它的含义而想要明确,那么你总是可以使用Union
:但我怀疑这是一个好主意,
Optional
是一个指示性名称,它确实可以节省几次击键 .正如@ Michael0x2a注释中指出的那样,Union [T,None]转换为Union [T,type(None)],因此不需要在这里使用类型 .
在视觉上这些可能会有所不同,但在编程上,在两种情况下,结果完全相同;
Union[datetime.datetime, NoneType]
将是get_some_date.__annotations__
*中存储的类型:*使用
typing.get_type_hints
获取对象的__annotations__
属性,而不是直接访问它 .