默认为 None 的参数是否应该总是类型提示为 Optional[]?

gmo*_*lau 3 python typechecking type-hinting mypy

比较这两个函数:

from typing import Optional

def foo1(bar: str = None) -> None:
    print(bar)

def foo2(bar: Optional[str] = None) -> None:
    print(bar)
Run Code Online (Sandbox Code Playgroud)

Mypy 不会抱怨他们中的任何一个。那么Optional[]真的有必要吗?这两个声明之间有什么细微的区别吗?

mgi*_*son 9

PEP-484 自原始答案撰写以来已更新。在现代 python 类型检查中,最好是Optional明确的。引用 PEP:

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

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

这将被视为等效于:

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

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