创建部分函数,​​但保留结果函数中的参数种类

Creating a partial function, but preserving the kind of parameters in the resulting function

可以使用 functools 中的 partial 函数在 python 中创建部分函数,​​但是这样做通常会将某些参数更改为仅限关键字的参数。例如:

def foo(a, b, c, d):
    return a*b - c*d

bar = functools.partial(foo, b=2, c=3)

inspect.signature(foo)
# <Signature (a, b, c, d)>

inspect.signature(bar)
# <Signature (a, *, b=2, c=3, d)>

在示例中,参数 a 保留其原始 kind,但 d 现在仅是关键字。有没有办法将函数的参数绑定到某些值,同时保留其他参数的种类?换句话说,一种使 bar 从功能上等同于:

的方法
def bar(a, d):
    return a*2 - 3*d

bar可以是任何函数,并且可以绑定任何参数组合。

functools.partial 无法做到这一点。 Python-ideas 邮件列表中多次提出了类似的想法,例如参见here or here (also this SO question)。这个想法是跳过一些位置参数,所以在你的情况下你可以这样做:

bar = partial(foo, SKIP, 2, 3)

然而,它从未实现过,所以你今天不能使用它。

你可以做的是将你的函数调用包装在另一个具有所需签名的函数中(lambda 或“正常”函数):

def bar(a, d):
    return foo(a, 2, 3, d)

另一种选择是要求函数的用户通过关键字传递参数。然而,如果没有真正的用例,很难判断什么是最好的方法。