为什么 mypy 在这个由 MonkeyType 自动注释的模块上失败?

Why does mypy fail on this automatically annotated module by MonkeyType?

假定以下模块和脚本文件:

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')

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

$ 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) 没问题,即使这最终会导致运行时崩溃:您不能将字符串和整数相加。