例如:
def foo(bar: int = None):
pass
当我检查
bar
的类型/注释时,pycharm 告诉我它是 Optional[int]
。
bar: int = None
看起来比 bar: Optional[int] = None
干净得多,尤其是当你有 10 个以上参数时。
那么我可以简单地省略
Optional
吗? mypy 或其他 linter 等工具会将这种情况突出显示为错误吗?
看起来 python 本身不喜欢这个想法:
In [1]: from typing import Optional
In [2]: from inspect import signature
In [3]: def foo(a: int = None): pass
In [4]: def bar(a: Optional[int] = None): pass
In [5]: signature(foo).parameters['a'].annotation
Out[5]: int
In [6]: signature(bar).parameters['a'].annotation
Out[6]: typing.Union[int, NoneType]
不。以前允许省略
Optional
,但现已删除。
此 PEP 的过去版本允许类型检查器在默认值为 None 时采用可选类型 [...] 这不再是推荐的行为。类型检查器应该朝着要求明确可选类型的方向发展。
某些工具可能仍提供旧行为以实现遗留支持。即使是这样,也不要指望它将来会得到支持。
具体而言,mypy 默认情况下仍然支持隐式
Optional
,但明确指出这可能会在未来发生变化:
可选类型和 None 类型mypy/#9091(mypy v0.782) [...] 您可以使用
--no-implicit-optional
命令行选项来停止将具有 None 默认值的参数视为具有隐式Optional[...] 类型。
这可能会成为未来的默认行为。此行为的弃用可在