[英]How to specify "nullable" return type with type hints
假设我有一个功能:
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 Union[T, None]
的评论中指出的那样,Union[T, type(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__
属性,而不是直接访问它。
您可以只使用垂直线datetime | None
datetime | None
(类似于 OR 运算符):
def get_some_date(some_argument: int=None) -> datetime | None:
# rest of code
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.