更改变量类型时如何编写类型提示?

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)

但我更愿意覆盖xy而不是定义两个新变量xlyl