python - Mypy 允许 `List[str]` 具有 `Tuple[str, List[str]]` 类型的值

标签 python mypy

下面的缩小示例最初是在更改我的工作代码库时发现的。我有行 x: List[str] = [] 所以我希望 mypy 会强制执行这一点,但在这个例子中似乎没有。如果我想让 mypy 捕捉到这个,我应该做什么不同的事情?

from typing import List

x: List[str] = []
y = ["world"]
z = ["hello"]

def go(boop):
    return f"{boop}!", y

x = list(map(go, z))
print(x)

# output:
# [('hello!', ['world'])]
$ mypy mypy_lists.py   
Success: no issues found in 1 source file
$ python3 mypy_lists.py
[('hello!', ['world'])]

编辑:

就上下文而言,go 定义的 , y 部分是一个复制粘贴错误,我希望仅通过 x: List[str] 注释,但也许我必须更新 mypy 类型检查的内部模型,并且少信任它。

编辑2:

鉴于已接受的答案,我可以通过类型提示信任 mypy 的程度似乎与 mypy 的配置方式直接相关。这并不令人惊讶,但值得记住。

最佳答案

似乎向 go 函数添加类型注释会导致 mypy 正确识别问题:

$ mypy -c 'from typing import List, Tuple

x: List[str] = []
y = ["world"]
z = ["hello"]

def go(boop: str) -> Tuple[str, List[str]]:
    return f"{boop}!", y

x = list(map(go, z))
print(x)'
<string>:10: error: Argument 1 to "map" has incompatible type "Callable[[Any], Tuple[str, List[str]]]"; expected "Callable[[str], str]"
Found 1 error in 1 file (checked 1 source file)

关于python - Mypy 允许 `List[str]` 具有 `Tuple[str, List[str]]` 类型的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69618160/

相关文章:

python - 用于建模纸牌游戏的现成 Javascript 库?

python - Mypy 无法从文字列表中推断出项目的类型

python - mypy 对 Callable 的类型检查认为成员变量是一个方法

python - mypy: "__eq__"与父类(super class)型 "object"不兼容

Python 列表理解不适用于 itertools.groupby 解码

python - np.vectorize 和 np.apply_along_axis 两次将相同的参数传递给映射函数

python - 覆盖父类(super class)型的协程时如何使用 mypy?

python - 我应该为方法 `self` 参数使用什么类型?

python - 在sqlalchemy中设置事件时区分插入和更新

python - 如何在 Flask 中使用 SSL