如果我将默认设置为“无”,我可以省略可选吗?

问题描述 投票:0回答:2

例如:

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]
python python-typing mypy
2个回答
59
投票

不。以前允许省略

Optional
,但现已删除。

此 PEP 的过去版本允许类型检查器在默认值为 None 时采用可选类型 [...] 这不再是推荐的行为。类型检查器应该朝着要求明确可选类型的方向发展。

某些工具可能仍提供旧行为以实现遗留支持。即使是这样,也不要指望它将来会得到支持。

具体而言,mypy 默认情况下仍然支持隐式
Optional

,但明确指出这可能会在未来发生变化:


可选类型和 None 类型

(mypy v0.782) [...] 您可以使用

--no-implicit-optional

命令行选项来停止将具有 None 默认值的参数视为具有隐式Optional[...] 类型。

这可能会成为未来的默认行为。

此行为的弃用可在
mypy/#9091

中跟踪


19
投票
PEP 484

中定义的标准的先前版本允许这样做。 但是,最新版本在

Union 部分

中说明了以下内容:

此 PEP 的过去版本允许类型检查器假设一个可选的 当默认值为 None 时键入,如以下代码所示:

def handle_employee(e: Employee = None): ...

这将被视为等同于:

def handle_employee(e: Optional[Employee] = None) -> None: ...

这不再是推荐的行为。类型检查器应该移动
要求明确可选类型。

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

© www.soinside.com 2019 - 2024. All rights reserved.