我正在尝试创建一个返回部分应用的可调用函数,但是在 mypy 类型检查时遇到了问题。
这是我的第一个实现:
帮我解释一下我在 stackoverflow 上的问题。例如,找到标题和正文
此代码:
from collections.abc import Callable
from functools import partial
def f(i: int, j: float, k: int) -> int:
return i + int(j) + k
def g(a: float) -> Callable[[int, int], int]:
return partial(f, j=a)
fun: Callable[[int, int], int] = g(3.0)
r: int = fun(4, 5)
print(r)
通过 mypy 检查成功
但不能运行
r: int = fun(4, 5) TypeError: f() 为参数 'j' 获得了多个值
为了解决这个问题,我调用带有命名参数的函数
from functools import partial
def f(i: int, j: float, k: int) -> int:
return i + int(j) + k
def g(a: float) -> Callable[[int, int], int]:
return partial(f, j=a)
fun: Callable[[int, int], int] = g(3.0)
# line 12 in my code (where the error message comes from)
r: int = fun(i=4, k=5)
print(r)
现在运行良好
但是 mypy 检查失败
main.py:12:错误:意外的关键字参数“i” [call-arg] main.py:12:错误:意外的关键字参数“k” [call-arg] 在 1 个文件中发现 2 个错误(检查了 1 个源文件)
有没有办法注释此代码,使其既能正确运行又能通过 mypy 的类型检查?我尝试了各种类型提示组合,但还没有找到既能满足运行时行为又能满足静态类型检查的解决方案。
我知道有这个解决方案,无需使用部分
from collections.abc import Callable
def f(i :int,j : float,k :int) ->int:
return i+int(j)+k
def g(a :float) -> Callable[[int,int],int]:
def ret(i,k):
return f(i,a,k)
return ret
fun :Callable[[int,int],int]= g(3.0)
r : int = fun(4,5)
print(r)
但我真的想使用 Callable,因为我正在使用具有大量参数的函数,而且只需说出要替换哪些参数就更简单了