下面的代码似乎产生了两个mypy错误:Overloaded function signatures 1 and 3 overlap with incompatible return types
和Overloaded 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:
...