假设我有一个功能:
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
的返回类型?
你在找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的评论中指出的那样,qazxsw poi被转换为qazxsw poi所以不需要在这里使用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]}
属性,而不是直接访问它。