Uba*_*eri 8 python python-3.x mypy
说我有
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)
Run Code Online (Sandbox Code Playgroud)
如您所见,有两个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]
Run Code Online (Sandbox Code Playgroud)
解决方法可能是定义新变量并调整 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
Run Code Online (Sandbox Code Playgroud)
但我更愿意覆盖x和y而不是定义两个新变量xl和yl。
| 归档时间: |
|
| 查看次数: |
2816 次 |
| 最近记录: |