一个简单的例子
def ff(m):
return m+1
def fun(f, *args, **kwargs):
n = kwargs.get('key', 0)
print args, kwargs
return f(*args)+n
a = fun(ff, 1)
print a
b = fun(ff, 1, key=10)
print b
运行结果:
(1,) {}
2
(1,) {'key': 10}
12
如果我们要实现以fun(ff, 1)的形式,实现b的值,该怎么办呢?有两种办法,闭包和装饰器。
闭包包含了一个函数及其环境变量,因此我们可以把其它参数(这里指的是key),整理成闭包;而装饰器则不改变函数的定义,只是在函数运行期间动态增加函数的功能,因此我们可以在函数运行的时候注入其他参数(这里指的是key)。
闭包(Closure)
def create_fun(num):
def fun_bound(f, *args):
return fun(f, *args, key=num)
return fun_bound
temp = create_fun(10)
c = temp(ff, 1)
print c
运行结果:
(1,) {'key': 10}
12
装饰器(Decorator)
import functools
def create_fun(num):
def decorator(F):
@functools.wraps(F)
def fun_bound(f, *args):
return F(f, *args, key=num)
return fun_bound
return decorator
@create_fun(10)
def fun(f, *args, **kwargs):
n = kwargs.get('key', 0)
print args, kwargs
return f(*args)+n
d = fun(ff, 1)
print d
运行结果:
(1,) {'key': 10}
12
除了上述两个方法,还有一种更简洁的思路,就是使用Python中的偏函数。在偏函数中,不需要定义新的函数,就可以把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数。读者可以自己去实践。
转载请注明:宁哥的小站 » Python语法糖——闭包与装饰器