1、减少可调用对象的参数个数
【问题】你有一个被其他 python 代码使用的callable对象,可能是一个回调函数或者是一个处理器,但是它的参数太多,导致调用时出错。
【解决方案】
如果需要减少某个函数的参数个数,你可以使用functools.partial()
.partial()
函数允许你给一个或多个参数设置固定值,减少接下来被调用时的参数个数。
def spam(a,b,c,d):
print(a,b,c,d)
现在我们使用partiial()
函数来固定某些参数值:
from functools import partial
s1 = partial(spam,1)
s1(2,3,4)
# 1,2,3,4
s1(4,5,6)
# 1,4,5,6
s2=partial(spam,d=42) #d=42
s2(1,2,3)
# 1,2,3,42
s3=partial(spam,1,2,d=42) # a=1,b=2,d=42
s3(3)
#1,2,3,42
s3(4)
#1,2,4,42
可以看出partial()
固定某些参数并返回一个新的callable对象。这个新的callable接受未赋值的参数,然后跟之前已经赋值过的参数合并起来,最后将所有参数传递给原始函数。
2、内联回调函数
【问题】
当你编写使用回调函数的代码的时候,担心很多小函数的扩张可能会弄乱程序控制流。你希望找到某个方法来让代码看上去更像一个普通的执行序列。
【解决方案】
通过使用生成器和协程可以使得回调函数内联在某个函数中。为了演示说明,假设你有如下所示的一个执行某种计算任务然后调用一个回调函数的函数
def apply_async(func,args,*,callback):
result = func(*args)
callback(result)