提问者:小点点

如果我将default设置为none,是否可以省略Optional?


例如:

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]

共2个答案

匿名用户

否。以前允许省略可选,但后来已删除。

此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: ...

这不再是推荐的行为。 类型检查器应该转向要求将可选类型显式化。

对此我很高兴。 在我看来,它看起来很刺耳。