python - 为什么 mypy 在 MonkeyType 自动注释的模块上失败?

标签 python python-3.x static-analysis mypy

假设有以下模块和脚本文件:

mymodule.py

# Module to be annotated by MonkeyType
def add(a, b):
    return a + b

myscript.py

from mymodule import add

add(2, 3)
add('x', 'y')

使用 MonkeyType 自动注释模块使用 Ubuntu 终端的模块。

$ monkeytype run myscript.py
$ monkeytype apply mymodule

mymodule.py 现在已使用添加的注释进行更改。

# Module annotated by monkeytype
from typing import Union

def add(a: Union[int, str], b: Union[int, str]) -> Union[int, str]:
    return a + b

但是如果我运行 mypy ,静态类型检查器,执行因 2 个错误而终止。 为什么会出现这种情况?

$ mypy mymodule.py
mymodule.py:4: error: Unsupported operand types for + ("int" and "str")
mymodule.py:4: error: Unsupported operand types for + ("str" and "int")
mymodule.py:4: note: Both left and right operands are unions
Found 2 errors in 1 file (checked 1 source file)

顺便说一句,我使用 arch Python 3.8。

最佳答案

不能保证 MonkeyType 将生成的类型注释一定是正确的:使用运行时信息推导类型是一种具有多个基本限制的技术。

引用自述文件:

MonkeyType’s annotations are an informative first draft, to be checked and corrected by a developer.

在这种特殊情况下,类型不正确,因为类型签名意味着执行 add("foo", 3) 是可以的,即使这最终会导致运行时崩溃:你可以'将字符串和整数相加。

关于python - 为什么 mypy 在 MonkeyType 自动注释的模块上失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60318119/

相关文章:

python - 如何从python中的字符串获取索引位置而不产生重复结果

去看 vert : catches inner but not outer race-condition

c++ - 用于在编译前检测 C++ 代码中未捕获异常的静态代码分析工具?

java - 未知公式的包装函数

python - 无需停止程序即可输入

python - "ValueError: could not convert string to float"转换输入时

c++ - 检查交叉转换是否可行?

python - Pandas :重命名具有相同名称的列

python - 恢复向量的排列

Python:基于 Pandas 中的 2 列分箱