Python 类型:签名不同时"overlap"重载的 Mypy 错误



下面的代码似乎产生了两个mypy错误:Overloaded function signatures 1 and 3 overlap with incompatible return typesOverloaded function signatures 2 and 3 overlap with incompatible return types;但是所有的重载都有不同的签名- Literal[True], Literal[False]和None不重叠。

@overload
def func_a(*, a: Literal[False] = ...) -> str:
...

@overload
def func_a(*, a: None = ...) -> str:
...

@overload
def func_a(*, a: Literal[True] = ...) -> int:
...

def func_a(*, a: Optional[bool] = None) -> str | int:
if a:
return 1
return "foo"

var1 = func_a()  # str correctly discovered by VSCode Pylance
var2 = func_a(a=False)  # str correctly discovered by VSCode Pylance
var3 = func_a(a=True)  # int correctly discovered by VSCode Pylance

为什么我认为他们重叠,我怎么去解决这个问题?

Mypy version: 0.991

Python版本:3.11.1

问题是,通过为每个过载编写= ...默认值,您已经在每个过载中将参数标记为可选。一个普通的func_a()调用匹配函数的每一个重载。

你需要解决这个问题,所以func_a()只匹配一个过载。有一种方法:

@overload
def func_a(*, a: Literal[False]) -> str:
...
@overload
def func_a(*, a: Literal[True]) -> int:
...
@overload
def func_a(*, a: None = None) -> str:
...

这里,只有None重载将参数标记为可选,因此func_a()只匹配该重载。

或者,您可以使无参数版本成为自己的重载:

@overload
def func_a(*, a: Literal[False]) -> str:
...
@overload
def func_a(*, a: Literal[True]) -> int:
...
@overload
def func_a(*, a: None) -> str:
...
@overload
def func_a() -> str:
...

相关内容

  • 没有找到相关文章

最新更新