创建部分函数,但保留结果函数中的参数种类
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)
另一种选择是要求函数的用户通过关键字传递参数。然而,如果没有真正的用例,很难判断什么是最好的方法。
可以使用 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)
另一种选择是要求函数的用户通过关键字传递参数。然而,如果没有真正的用例,很难判断什么是最好的方法。