比较这两个函数:
from typing import Optional
def foo1(bar: str = None) -> None:
print(bar)
def foo2(bar: Optional[str] = None) -> None:
print(bar)
Mypy并没有抱怨他们中的任何一个。 Optional[]
真的有必要吗?这两个声明之间有什么微妙的区别吗?
答案 0 :(得分:2)
这实际上是一个难以回答的问题:-)。 PEP-484州:
当默认值为None时,也会自动采用可选类型,例如:
def handle_employee(e: Employee = None): ...
这相当于:
def handle_employee(e: Optional[Employee] = None) -> None: ...
因此,根据PEP(目前的情况),Optional
很好......可选: - )。
但是,如果默认值不是None
,并且您设置了--strict-optional
标记,那么您仍然需要Optional
。请参阅:https://mypy.readthedocs.io/en/latest/kinds_of_types.html#strict-optional
另请注意,mypy跟踪器上有一个关于删除隐式Optional
的问题。有关详细信息,请参阅https://github.com/python/typing/issues/275。但是tl; dr;这可能是“明确比隐含更好”。如果你为可选参数写出Optional
,那么你永远不会错。如果省略它,则可能是错误的,具体取决于默认值,正在使用的mypy标志以及(可能)mypy版本。