当函数通过 `ParamSpec` 通用类传递时,过载未得到解析
作者: tibbe创建于 2026年9月16日更新于 2026年9月16日
标签genericsoverloadsparamspec
页:1
当超载函数被传递到使用`ParamSpec'的通用函数时,ty不能解决超载与实际论据的矛盾. 它返回超载返回类型的结合。 神秘和平和都解决正确。
py 从打入可调用、 字迹、 超载、 显示 类型
@ 过载 f (, 旗帜: literal [False] -- > str:...) @ 过载 f(,旗:literal [True]=.]- > int:. f (*, 旗帜: bul = True) - > int QQ str: 如果旗帜另作"a",则返回 1
调用[**P,T](fn:可调用[P,T], *args: P.args, **kwargs: P.kwargs) - > T: 返回 fn(*args, **kwargs)
显示类型 (f ()) # ty: int mypy: int pyright: int 已显示类型( call( f)) # ty: str \ \ \ \ int mypy: int pyright: int
最后一行应为`int'。 没有 " lag " 论点被采纳,因此第二个超载问题通过默认适用。
通常的点击方法是`Executor.sumit',其第一个参数是`Callable[P,T]':
py
take int( executor. sumit (f). 结果 ()
# 错误[无效- 参数类型] : 期望`int', 找到`str- { int'有3个或更多超载的ty有时会选择最后一个超载的返回类型而不是结合,但效果是一样的.
这看起来像2383号的另一半。 这个问题在帕拉姆斯佩克支持登陆时被终结了,这个论点现在确实被接受——但返回类型仍然是错误的.
影响:我们评估了Ty在一个~1600文件代码库上,这个代码库在Mypy严格下是干净的. 这种模式产生了689个诊断中的437个,因为我们的数据库访问器在选择返回型号的 " Literal[bool] " 旗帜上超载,通常通过`executor.sumit ' 来称呼。
可能与此有关: #2568, #3415, #2799.
翻译:
页:1
内容来源: astral-sh/ty