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

问题描述 投票:0回答:1

说我有

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

python mypy python-typing
1个回答
0
投票

以下是评论中内容的结构化摘要:

关键问题

Mypy 是一个 static 类型检查器,并且用原始类型之外的值重新定义变量是一个 dynamic 操作,所以 mypy 会抱怨这一点。

静态解决方案

  1. 解决此问题的一种方法是为新结果提供新的(可能具有信息性/描述性的)名称:
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
  1. 另一种方法是一开始就不要给他们起名字:
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 配置文件

© www.soinside.com 2019 - 2024. All rights reserved.