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默认值是str,Optional[str]是 的超集str。正如您所指出的,Optional[str]是strunion None。
这使得调用者可以像这样显式传递None:
my_func(..., None)
Run Code Online (Sandbox Code Playgroud)