如果参数的默认值不是None,是否应该使用Typing.Optional?

Should Typing.Optional be used if the default value of the parameter is not None?

所以我知道 Typing.Optional 的标准用例,这意味着它是类型和 None 之间的联合。例如

def my_func(a, b=None):
  # type: (str, Typing.Optional[str]) -> str
  # do stuff with the strings

但是如果 B 的默认值是一个实际的字符串呢?

def my_func(a, b='hello'):

b 的类型应该是 Optional[str] 还是 str?因为从用户的角度来看它是可选的,因为在调用此函数时不需要传递值,但这并不意味着 None 应该可以工作。 Mypy 似乎没有检测到任何一个问题。

具有类型 Optional[...] 的参数与用户是否必须指定它无关,而是函数是否必须考虑参数可能是 None。给出这个例子:

def my_func(a, b='hello'):
   pass

b 将被推断为 str,因为 b,即使调用者未提供,也将具有非 None 值。因此,尝试使用 None 覆盖默认值,如下所示:

my_func(..., None)

会导致 MyPy 错误。

注意我没有说b不能显式标注为Optional[str]。这很好:

def my_func(a, b: Optional[str] = 'hello'):
   pass

b这里可以注解为Optional[str],因为b默认是str,而Optional[str]是[=17=的超集].正如您指出的那样,Optional[str]str 联合 None.

这使调用者能够像这样显式传递 None

my_func(..., None)