如何使用类型提示指定 "nullable" return 类型
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
的内容指定 return 类型?
您正在寻找 Optional
。
由于您的 return 类型可以是 datetime
(从 datetime.utcnow()
编辑的 return)或 None
,您应该使用 Optional[datetime]
:
from typing import Optional
def get_some_date(some_argument: int=None) -> Optional[datetime]:
# as defined
根据有关打字的文档,Optional
是 shorthand 用于:
Optional[X]
is equivalent to 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__
属性而不是直接访问它。
您可以只使用垂直线 datetime | None
(类似于 OR 运算符):
def get_some_date(some_argument: int=None) -> datetime | None:
# rest of code
假设我有一个函数:
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
的内容指定 return 类型?
您正在寻找 Optional
。
由于您的 return 类型可以是 datetime
(从 datetime.utcnow()
编辑的 return)或 None
,您应该使用 Optional[datetime]
:
from typing import Optional
def get_some_date(some_argument: int=None) -> Optional[datetime]:
# as defined
根据有关打字的文档,Optional
是 shorthand 用于:
Optional[X]
is equivalent toUnion[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__
属性而不是直接访问它。
您可以只使用垂直线 datetime | None
(类似于 OR 运算符):
def get_some_date(some_argument: int=None) -> datetime | None:
# rest of code