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

foo*_*iey 5 python typing mypy

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

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

但是如果 B 的默认值是实际字符串怎么办?

def my_func(a, b='hello'):
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*hac 12

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

def my_func(a, b='hello'):
   pass
Run Code Online (Sandbox Code Playgroud)

b将被推断为str因为b,即使调用者没有提供,也将具有非值None。因此,尝试用None这样的方式覆盖默认值:

my_func(..., None)
Run Code Online (Sandbox Code Playgroud)

会导致 MyPy 错误。

请注意,我并没有说b不能明确注释为Optional[str]. 这可以:

def my_func(a, b: Optional[str] = 'hello'):
   pass
Run Code Online (Sandbox Code Playgroud)

b可以在这里注释,Optional[str]因为b默认值是strOptional[str]是 的超集str。正如您所指出的,Optional[str]strunion None

这使得调用者可以像这样显式传递None

my_func(..., None)
Run Code Online (Sandbox Code Playgroud)