例如:

def foo(bar: int = None):
    pass

当我判断bar的类型/注释时,pycharm告诉我它是Optional[int].

bar: int = None看起来比bar: Optional[int] = None干净得多,尤其是当你有10个以上的参数时.

所以我可以省略Optional吗?像mypy或其他Linter这样的工具会将这种情况强调为错误吗?

看起来python本身不喜欢这个 idea :

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]

推荐答案

没有.之前允许省略Optional,但后来被删除.

当默认值为None[…]时,this PEP个类型判断器中的past version个允许采用可选类型

这不再是推荐的行为.类型判断器应该朝着要求可选类型显式化的方向发展.

一些工具可能仍然为遗留支持提供旧的行为.即使是这样,也不要指望将来会得到支持.


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

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

[...] 可以使用--no-implicit-optional命令行选项停止将非默认值的参数视为具有隐式可选[…]类型It’s possible that this will become the default behavior in the future.

对这种行为的抨击在mypy/#9091个国家都有记录

Python-3.x相关问答推荐

Python网页抓取:代码输出:汤未定义

在循环访问XML中的多个层时,xml.etree.Elementree Python3解析器不起作用

Python多处理池:缺少一个进程

使用递归将int转换为字符串

如何从包含SPAN文本的标记中获取链接

使用 GEKKO 使用代码解决最佳时间控制问题时出现 IndexError

删除Pandas 数据框行不起作用

如何将元组列表拆分为两个单独的列表?

协议不支持地址系列在将 Scapy L3socket 与 WSL 一起使用时

根据另一列值对多个数据框列进行分组

总结基于条件的值,如果不匹配则保留当前值

在带有 M1 芯片(基于 ARM 的 Apple Silicon)的 Mac 上安装较早版本的 Python(3.8 之前)失败

Tkinter AttributeError:对象没有属性'tk'

使用逗号时,除了处理程序中的语法无效

如何在元素列表中找到最大的数字,可能是非唯一的?

Python configparser 不会接受没有值的键

PIL 在图像上绘制半透明方形覆盖

在 Alembic 迁移期间更新列内容

如何判断列表中的所有项目是否都是字符串

在 Python 中生成马尔可夫转移矩阵