Python语法糖——闭包与装饰器

Python fireling 6979℃

一个简单的例子


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语法糖——闭包与装饰器

喜欢 (6)