如果默认为None的参数总是被类型提示为Optional []?

时间:2018-04-09 00:20:38

标签: python type-hinting typechecking mypy

比较这两个函数:

from typing import Optional

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

def foo2(bar: Optional[str] = None) -> None:
    print(bar)

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

1 个答案:

答案 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版本。