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 中定义的先前版本的标准允许这样做。
此 PEP 的过去版本允许类型检查器在默认值为 None 时采用可选类型,如以下代码所示:
Run Code Online (Sandbox Code Playgroud)def handle_employee(e: Employee = None): ...这将被视为等同于:
Run Code Online (Sandbox Code Playgroud)def handle_employee(e: Optional[Employee] = None) -> None: ...这不再是推荐的行为。类型检查器应该朝着要求明确可选类型的方向发展。
我很高兴这一点。在我看来,它实际上看起来很刺耳。
| 归档时间: |
|
| 查看次数: |
3403 次 |
| 最近记录: |