gpt4 book ai didi

Python 键入 : Mypy errors with overload "overlap" when signatures are different

转载 作者:行者123 更新时间:2023-12-03 07:59:23 28 4
gpt4 key购买 nike

以下代码似乎会生成两个 mypy 错误:重载函数签名 1 和 3 与不兼容的返回类型重叠重载函数签名 2 和 3 与不兼容的返回类型重叠 ;但所有重载都有不同的签名 - 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 认为它们重叠,我该如何解决这个问题?

Mypy版本: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:
...

关于Python 键入 : Mypy errors with overload "overlap" when signatures are different,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74901020/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com