Answers:
您正在寻找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__
直接访问它的属性来代替。
Optional[T]
类型在函数式编程社区中众所周知。读者不仅会知道它的意思Union[T, None]
,而且还将认识到使用模式:当没有有意义的答案,有错误或未找到结果时,函数应返回None。
Union[datetime, type(None)]
为Union[datetime, None]
-根据PEP 484,None
在类型注释中使用始终与等同type(None)
。(该typing
文档实际上None
在大多数情况下都使用,但此处未使用,这是一个疏忽)。