defouter(a, b):definner(**kwargs):return"I received params a={}, b={} from outer function, ""but c={} is passed to myself".format(a, b, kwargs['c'])return inner
f = outer(1,2)
上面的代码定义了函数outer以及嵌套在里面的函数inner
outer接收参数a, b, f = outer(1, 2) 就像是构造了一个类实例一样,初始化了a, b 的值,在inner函数里可以直接使用:
>>> f(c=3)'I received params a=1, b=2 from outer function, but c=3 is passed to myself'
这样就把额外的参数传给了内部函数,如同先实例化、传入一些值,再调用实例方法一样。
7.10 在回调函数中携带额外的状态
希望给回调函数携带一个额外的状态
举个简单例子,如果我们希望在一个主要的处理函数之后,使用一个回调函数打印处理结果,可能会这样写:
defcompute_sum(a, b):return a + b
defprint_result(result):print("Get the result, it is:{}".format(result))defrun(func, args,*, callback):# 执行数据处理
res = func(*args)# 使用回调打印结果
callback(res)
调用run()函数:
>>> run(compute_sum,[1,2], callback=print_result)
Get the result, it is:3
这效果固然好,但如果想给回调函数添加一个状态:例如:这是第几次调用?
可以利用7.9节中提到的闭包(closure)给回调添加状态,像这样:
defprint_result():
count =0defdo_print_result(result):nonlocal count
count +=1print("{}th time to get the result, it is:{}".format(count, result))return do_print_result
>>> print_result = print_result()>>> run(compute_sum,[1,2], callback=print_result)
1th time to get the result, it is:3>>> run(compute_sum,[1,2], callback=print_result)
2th time to get the result, it is:3>>> run(compute_sum,[1,2], callback=print_result)
3th time to get the result, it is:3
7.11 内联回调函数
假设有一个函数这样来调用回调函数:
defapply_async(func, args,*, callback):# 函数的主体逻辑
result = func(*args)# 调用回调函数
callback(result)
classAsync:def__init__(self, func, args):
self.func = func
self.args = args
definlined_async(func):
@wraps(func)defwrapper(*args):
f = func(*args)
result_queue = Queue()
result_queue.put(None)whileTrue:
result = result_queue.get()try:
a = f.send(result)
apply_async(a.func, a.args, callback=result_queue.put)except StopIteration:breakreturn wrapper
结合以上两段代码,使用yield语句,回调函数变成内联式的:
defadd(x, y):return x + y
@inlined_async
deftest():
r =yield Async(add,(2,3))print(r)
r =yield Async(add,("Hello","World"))print(r)for n inrange(10):
r =yield Async(add,(n, n))print(r)print("Goodbye")