如何查看mypy为Python函数调用匹配的重载函数?
查看mypy匹配的重载函数方法
可以通过以下方式查看mypy为每个函数调用匹配的具体重载:
方法1:使用reveal_type结合--verbose参数
在代码中用reveal_type()包裹每个调用,再通过mypy的--verbose选项运行,mypy会在输出中明确显示匹配的重载序号和类型信息。
修改你的代码示例:
from typing import Literal, overload @overload def foo(x: str, y: str, z: Literal[True]) -> int: ... @overload def foo(x: str, y: str, z: Literal[False]) -> str: ... @overload def foo(x: str = ..., y: str = ..., z: Literal[False] = ...) -> str: ... @overload def foo(*, x: str = ..., y: str = ..., z: Literal[True]) -> int: ... def foo(x: str = "a", y: str = "b", z: bool = False) -> str | int: if z: return 1 else: return x + y reveal_type(foo()) reveal_type(foo(z=True)) reveal_type(foo(z=False)) reveal_type(foo(x="a", z=True)) reveal_type(foo("a", "b", True)) reveal_type(foo(x="a", z=False)) reveal_type(foo("a", "b", False)) reveal_type(foo("a", y="b", z=True)) reveal_type(foo("a", y="c", z=False))
运行命令:
mypy --verbose your_script.py
mypy输出会包含类似内容,明确匹配的重载:
your_script.py:20: note: Revealed type is "builtins.str" your_script.py:20: note: Matched overload 3 of 4 for "foo"
方法2:利用mypy的模糊匹配提示
如果重载存在冲突或匹配歧义,mypy会直接在提示信息中列出候选重载;对于无错误的匹配,--verbose是最直接的查看方式。
你的调用标注验证
结合mypy的匹配规则,你的部分标注存在错误,正确匹配如下:
foo():匹配第3个重载(正确)foo(z=True):匹配第4个重载(正确,调用用关键字参数,符合第4个重载的*仅关键字要求)foo(z=False):匹配第3个重载(正确)foo(x="a", z=True):匹配第4个重载(正确)foo("a", "b", True):匹配第1个重载(正确)foo(x="a", z=False):匹配第3个重载(正确)foo("a", "b", False):匹配第2个重载(正确)foo("a", y="b", z=True):匹配第1个重载(而非你标注的第4个)——第4个重载带*,要求所有参数必须用关键字传递,此调用中x是位置参数,不符合规则,因此匹配接受位置+关键字混合传递的第1个重载foo("a", y="c", z=False):匹配第2个重载(而非你标注的第3个)——此调用传递了x位置参数、y和z关键字参数,且z=False,符合第2个重载的参数类型要求,mypy会优先匹配参数更精确的重载
内容的提问来源于stack exchange,提问作者monte
相关产品推荐
相关产品推荐

