Python 如何指定;“可为空”;带有类型提示的返回类型

Python 如何指定;“可为空”;带有类型提示的返回类型,python,python-3.x,python-3.5,type-hinting,Python,Python 3.x,Python 3.5,Type Hinting,假设我有一个函数: 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(从datet

假设我有一个函数:

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
,因此应使用
可选的[datetime]

from typing import Optional

def get_some_date(some_argument: int=None) -> Optional[datetime]:
    # as defined
从有关键入的文档中,
可选
是以下内容的简写:

Optional[X]
相当于
Union[X,None]

其中,
Union[X,Y]
表示类型为
X
Y
的值


如果由于担心其他人可能会无意中发现
可选
而没有意识到它的含义,您希望明确,那么您可以始终使用
联合

from typing import Union

def get_some_date(some_argument: int=None) -> Union[datetime, None]:
但我怀疑这是一个好主意,
可选
是一个指示性名称,它确实节省了几次击键

正如@Michael0x2a
Union[T,None]
在注释中指出的,它被转换为
Union[T,type(None)]
,因此这里不需要使用
type

视觉上这些可能不同,但在程序上,在这两种情况下,结果完全相同
Union[datetime.datetime,NoneType]
将是存储在
get\u some\u date.\u注释中的类型。
*:


*使用
键入。获取\u type\u提示
以获取对象的
\u注释
属性,而不是直接访问它。

您可以将
Union[datetime,type(None)]
简化为
Union[datetime,None]
--根据,在类型注释中使用
None
始终被视为等同于
type(None)
。(在大多数情况下,
键入
文档实际上使用了
,但在这里没有,这是一个疏忽)。@Michael0x2a不知道,很有趣。补充道:)我刚开始提交来修复这个问题,所以希望文档在不久的将来会更加一致!
Optional[T]
类型在函数式编程社区是众所周知的。读者不仅会知道它的意思是
Union[T,None]
,而且还会认识到当没有有意义的答案、出现错误或结果未找到时函数将返回None的使用模式。在Python 3.10
datetime中,可以使用None
。在
键入
包中应用了错误的命名。它可以是
Nullable[X]
作为
Union[None,X]
的等价物。因此,无需解释
Optional
不适用于可选参数
>>> 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]}