这个答案更像是一个示例代码。以上所有答案都很好地解释了为什么应该使用partial。我将给出关于partial的观察和用例。
from functools import partial
def adder(a,b,c):
print('a:{},b:{},c:{}'.format(a,b,c))
ans = a+b+c
print(ans)
partial_adder = partial(adder,1,2)
partial_adder(3) ## now partial_adder is a callable that can take only one argument
上述代码的输出应该是:
a:1,b:2,c:3
6
注意,在上面的例子中,返回了一个新的可调用对象,它将形参(c)作为参数。注意,它也是函数的最后一个参数。
args = [1,2]
partial_adder = partial(adder,*args)
partial_adder(3)
上述代码的输出也是:
a:1,b:2,c:3
6
注意,*用于解包非关键字参数,返回的可调用对象的参数与上面相同。
另一个观察结果是:
下面的示例演示了partial返回一个可调用对象,该对象将接受
未声明的形参(a)作为参数。
def adder(a,b=1,c=2,d=3,e=4):
print('a:{},b:{},c:{},d:{},e:{}'.format(a,b,c,d,e))
ans = a+b+c+d+e
print(ans)
partial_adder = partial(adder,b=10,c=2)
partial_adder(20)
上述代码的输出应该是:
a:20,b:10,c:2,d:3,e:4
39
同样的,
kwargs = {'b':10,'c':2}
partial_adder = partial(adder,**kwargs)
partial_adder(20)
以上代码打印
a:20,b:10,c:2,d:3,e:4
39
我在使用Pool的时候不得不使用它。多处理模块的Map_async方法。你只能将一个参数传递给worker函数,所以我必须使用partial使我的worker函数看起来像一个只有一个输入参数的可调用对象,但实际上我的worker函数有多个输入参数。