如果参数的默认值不是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)
所以我知道 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)