如果我将默认设置为 None 可以省略 Optional 吗?

Aiv*_*ven 36 python type-hinting python-3.x mypy python-typing

例如:

def foo(bar: int = None):
    pass
Run Code Online (Sandbox Code Playgroud)

当我检查barpycharm的类型/注释时,告诉我它是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]
Run Code Online (Sandbox Code Playgroud)

Mis*_*agi 43

不可以Optional。以前允许省略,但此后已被删除。

一个过去版本这个PEP允许类型检查假设一个可选的类型时,默认值是无[...]

这不再是推荐的行为。类型检查器应该朝着要求明确可选类型的方向发展。

某些工具可能仍会为遗留支持提供旧行为。即使是这种情况,也不要指望将来会支持它。


具体来说,mypy 仍然Optional默认支持隐式,但明确指出这在未来可能会发生变化:

可选类型和 None 类型(mypy v0.782)

[...] 您可以使用--no-implicit-optional命令行选项停止将具有 None 默认值的参数视为具有隐式 Optional[...] 类型。这可能会成为未来的默认行为。

mypy/#9091 中跟踪了此行为的弃用


jua*_*aga 17

PEP 484 中定义的先前版本的标准允许这样做。

但是,最新版本在Union 部分声明了以下内容

此 PEP 的过去版本允许类型检查器在默认值为 None 时采用可选类型,如以下代码所示:

def handle_employee(e: Employee = None): ...
Run Code Online (Sandbox Code Playgroud)

这将被视为等同于:

def handle_employee(e: Optional[Employee] = None) -> None: ...
Run Code Online (Sandbox Code Playgroud)

这不再是推荐的行为。类型检查器应该朝着要求明确可选类型的方向发展。

我很高兴这一点。在我看来,它实际上看起来很刺耳。

  • 美绝对是情人眼里出西施。我的眼睛不敢苟同。 (7认同)