说我有
def foo(x: Union[str, list[str]], y: Union[str, list[str]]) -> tuple[list[str], list[str]]:
x = cast(Union[list[str], tuple[list[str], ...]], str2list(x))
y = cast(Union[list[str], tuple[list[str], ...]], str2list(y))
return x,y
def str2list(*args: Union[str, list[str]]) -> Union[list[str], tuple[list[str], ...]]:
vals = []
for x in args:
if not isinstance(x, list):
x = [x]
vals.append(x)
if len(args) == 1:
return vals[0]
else:
return tuple(vals)
x = 'My name is x'
y = ['First element', 'Second element']
z = str2list(x,y)
如您所见,
cast
中有两个foo
调用,但仍然mypy
抱怨
error: Incompatible types in assignment (expression has type "Union[List[str], Tuple[List[str], ...]]", variable has type "Union[str, List[str]]") [assignment]
解决方法可能是定义新变量并调整 foo 的返回类型,如下所示
def foo(
x: Union[str, list[str]], y: Union[str, list[str]]
) -> tuple[
Union[list[str], tuple[list[str], ...]],
Union[list[str], tuple[list[str], ...]],
]:
xl = cast(Union[list[str], tuple[list[str], ...]], str2list(x))
yl = cast(Union[list[str], tuple[list[str], ...]], str2list(y))
return xl, yl
但我更愿意覆盖
x
和 y
而不是定义两个新变量 xl
和 yl
。
以下是评论中内容的结构化摘要:
Mypy 是一个 static 类型检查器,并且用原始类型之外的值重新定义变量是一个 dynamic 操作,所以 mypy 会抱怨这一点。
def foo_1(
x: Union[str, list[str]], y: Union[str, list[str]]
) -> tuple[list[str], list[str]]:
cast_x = cast(Union[list[str], tuple[list[str], ...]], str2list(x))
cast_y = cast(Union[list[str], tuple[list[str], ...]], str2list(y))
return cast_x, cast_y
def foo_2(
x: Union[str, list[str]], y: Union[str, list[str]]
) -> tuple[list[str], list[str]]:
return cast(Union[list[str], tuple[list[str], ...]], str2list(x)), cast(
Union[list[str], tuple[list[str], ...]], str2list(y)
)
无需屈服于 mypy 的要求,只需通过使用
[assignment]
标志运行 mypy 即可消除这种特定类型的 --allow-redefinition
警告。如果您不想每次运行 mypy 时都在命令行中键入此标志,您可以将行 allow_redefinition = True
添加到您的 mypy 配置文件。