You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查看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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 18:27:37