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

Posted

技术标签:

【中文标题】如果我将默认设置为无,我可以省略 Optional 吗?【英文标题】:Can I omit Optional if I set default to None? 【发布时间】:2020-10-25 04:20:58 【问题描述】:

例如:

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]

【问题讨论】:

相关:Does a default parameters overwrite type hints for mypy? 顺便说一句,如果你的函数需要 10+ 个参数,也许是时候考虑重构了。 【参考方案1】:

没有。以前允许省略 Optional,但后来被删除了。

this PEP 的过去版本允许类型检查器在默认值为 None 时采用可选类型 [...]

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

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


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

Optional types and the None type (mypy v0.782)

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

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

【讨论】:

但是为什么:告诉我更多【参考方案2】:

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

但是,最新版本在Union section 中声明如下:

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

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

这将被视为等同于:

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

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

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

【讨论】:

以上是关于如果我将默认设置为无,我可以省略 Optional 吗?的主要内容,如果未能解决你的问题,请参考以下文章

swift 可选项(Optional)

VB在过程中 optional的作用和用法 property是干啥的

Swift之Optional 可选值

arcgis 10.2 导出地图,背景色可以设置为无吗?不要背景色。

如果我为无符号变量分配负值会发生啥?

Spring:如果 url 的安全性设置为无,则检查代码