例如:
def foo(bar: int = None):
pass
当我检查bar
的类型/注释时,pycharm告诉我它是optional[int]
。
bar:int=none
看起来比bar:optional[int]=none
干净得多,特别是当您有10多个参数时。
那么我可以简单地省略optional
吗? 像mypy或其他linter这样的工具会将这种情况突出显示为en错误吗?
看起来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]
否。以前允许省略可选
,但后来已删除。
此PEP的旧版本允许类型检查器在默认值为None[...]时假定可选类型
这不再是推荐的行为。 类型检查器应该转向要求将可选类型显式化。
有些工具可能仍然提供旧的行为来支持遗留。 即使是这样,也不要指望将来得到支持。
具体地说,mypy默认情况下仍然支持隐式可选
,但明确指出这一点将来可能会改变:
[...] 您可以使用--no-implicit-optional
命令行选项停止将具有None默认值的参数视为具有隐式可选[...] 打字。 这有可能成为未来的默认行为。
在MYPY/#9091中跟踪对此行为的反对
在PEP 484中定义的标准的先前版本允许这样做。
但是,最新版本的“Union”部分说明了以下内容:
此PEP的过去版本允许类型检查器在默认值为None时假定一个可选类型,如以下代码所示:
def handle_employee(e: Employee = None): ...
这将被视为相当于:
def handle_employee(e: Optional[Employee] = None) -> None: ...
这不再是推荐的行为。 类型检查器应该转向要求将可选类型显式化。
对此我很高兴。 在我看来,它看起来很刺耳。