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

2024-10-02 16:24:23 发布

您现在位置:Python中文网/ 问答频道 /正文

以下缩小的示例最初是在对我的作品的代码库进行更改时发现的。我有行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的配置方式直接相关。这并不奇怪,但要记住一件好事


Tags: py编辑go示例类型helloworld错误
2条回答

似乎向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)

默认情况下mypy忽略untyped function definitions

这有助于逐步将类型注释引入现有的代码库,而不必一次添加所有类型注释

就我个人而言,对于新项目,我使用^{}选项运行mypy,以避免意外地使函数未注释和绕过类型检查

相关问题 更多 >