假设我有一个函数:
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的东西指定返回类型?
假设我有一个函数:
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的东西指定返回类型?
你在找可选的。
由于您的返回类型可以是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]。
其中联合[X, Y]表示类型为X或Y的值。
如果你想要显式,因为担心其他人可能会偶然发现Optional,并没有意识到它的含义,你可以总是使用Union:
from typing import Union
def get_some_date(some_argument: int=None) -> Union[datetime, None]:
但我怀疑这是一个好主意,可选的是一个指示性的名称,它确实节省了几个按键。
正如@Michael0x2a在评论中指出的那样,Union[T, None]被转换为Union[T, type(None)],所以这里不需要使用type。
从视觉上看,它们可能不同,但从程序上看,这两种情况的结果完全相同;联盟[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]}
*使用打字。Get_type_hints获取对象的__annotations__属性,而不是直接访问它。
你可以使用垂直线datetime | None(类似于OR操作符):
def get_some_date() -> datetime | None:
# rest of code