使用带有多个参数的 functools partial
Using functools partial with multiple arguments
假设我有一个函数
def func(u,v,w,x, alpha = 4, beta = 5):
print('u ',u)
print('v ',v)
print('x ',w)
print('u ',x)
print('** kwarqs: alpha ',alpha)
print('** kwarqs: beta ',beta)
return u*4 + v*3 + w*2 + x
我现在想使用 functools.partial
使其成为部分函数。我将 u,v,w
变量设置为常量并创建函数 $$part=f(x)|_{u,v,w = \text{const}}$$
u = 2
v = 4
w = 5
part = partial(func,u,v,w, alpha = 'Hello 1', beta = 'Hello 2')
print(part(4))
结果是
u 2
v 4
w 5
x 4 # This is the remaining free variable
** kwarqs: alpha Hello 1
** kwarqs: beta Hello 2
34
如何创建函数
f(u) #or f(v),f(w)
f(v,x) #or all other variable combinations
f(v,alpha) # a combination of args and kwargs
?
此致
也欢迎解决方法。
我可以推荐您使用 lambda
吗?
f1 = lambda u : func(u,v,w,x, alpha = 4, beta = 5)
f2 = lambda v, x: func(u,v,w,x, alpha = 4, beta = 5)
f3 = lambda v, alpha: func(u,v,w,x, alpha = alpha, beta = 5)
用法和你想要的一样:
f1(u) #or f(v),f(w)
f2(v,x) #or all other variable combinations
f3(v,alpha) # a combination of args and kwargs
有趣的问题。你可以去把你的函数变成一个 kwarg-only 函数:
from functools import wraps, partial
def kwarged(func):
@wraps(func)
def wrapper(**kwargs):
return func(**kwargs)
return wrapper
然后您可以使用它来构建任何部分版本:
>>> func = kwarged(func)
>>> f_u = partial(func, v=5, w=2, x=4)
>>> f_u(u=7)
u 7
v 5
w 2
x 4
** kwarqs: alpha 4
** kwarqs: beta 5
51
>>> f_vx = partial(func, u=5, w=2)
>>> f_vx(v=3, x=6)
u 5
v 3
w 2
x 6
** kwarqs: alpha 4
** kwarqs: beta 5
39
>>> f_vx(v=3, x=6, alpha=9)
u 5
v 3
w 2
x 6
** kwarqs: alpha 9
** kwarqs: beta 5
39
即使所有参数都是带有默认值的 kwargs,您仍然必须传递所有未在 partial 中设置的原始位置参数:
>>> f_vx(v=3, alpha=9)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 10, in wrapper
TypeError: func() missing 1 required positional argument: 'x'
假设我有一个函数
def func(u,v,w,x, alpha = 4, beta = 5):
print('u ',u)
print('v ',v)
print('x ',w)
print('u ',x)
print('** kwarqs: alpha ',alpha)
print('** kwarqs: beta ',beta)
return u*4 + v*3 + w*2 + x
我现在想使用 functools.partial
使其成为部分函数。我将 u,v,w
变量设置为常量并创建函数 $$part=f(x)|_{u,v,w = \text{const}}$$
u = 2
v = 4
w = 5
part = partial(func,u,v,w, alpha = 'Hello 1', beta = 'Hello 2')
print(part(4))
结果是
u 2
v 4
w 5
x 4 # This is the remaining free variable
** kwarqs: alpha Hello 1
** kwarqs: beta Hello 2
34
如何创建函数
f(u) #or f(v),f(w)
f(v,x) #or all other variable combinations
f(v,alpha) # a combination of args and kwargs
?
此致
也欢迎解决方法。
我可以推荐您使用 lambda
吗?
f1 = lambda u : func(u,v,w,x, alpha = 4, beta = 5)
f2 = lambda v, x: func(u,v,w,x, alpha = 4, beta = 5)
f3 = lambda v, alpha: func(u,v,w,x, alpha = alpha, beta = 5)
用法和你想要的一样:
f1(u) #or f(v),f(w)
f2(v,x) #or all other variable combinations
f3(v,alpha) # a combination of args and kwargs
有趣的问题。你可以去把你的函数变成一个 kwarg-only 函数:
from functools import wraps, partial
def kwarged(func):
@wraps(func)
def wrapper(**kwargs):
return func(**kwargs)
return wrapper
然后您可以使用它来构建任何部分版本:
>>> func = kwarged(func)
>>> f_u = partial(func, v=5, w=2, x=4)
>>> f_u(u=7)
u 7
v 5
w 2
x 4
** kwarqs: alpha 4
** kwarqs: beta 5
51
>>> f_vx = partial(func, u=5, w=2)
>>> f_vx(v=3, x=6)
u 5
v 3
w 2
x 6
** kwarqs: alpha 4
** kwarqs: beta 5
39
>>> f_vx(v=3, x=6, alpha=9)
u 5
v 3
w 2
x 6
** kwarqs: alpha 9
** kwarqs: beta 5
39
即使所有参数都是带有默认值的 kwargs,您仍然必须传递所有未在 partial 中设置的原始位置参数:
>>> f_vx(v=3, alpha=9)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 10, in wrapper
TypeError: func() missing 1 required positional argument: 'x'