Python中语法糖及带参语法糖

在python中,@符号常被称作语法糖(装饰器),在某函数定义时,用以包装该函数,以达到截取,控制该函数的目的。

def d(f):
	print('d...')
	k=f                         #此处保留了传进来的原函数 f
	def f(x):
		return k(x)*2
	return f                    #此处不能写成f(x),f是函数句柄,如果带(),则调用,这里只返回句柄。
@d
def e(x):
	return x**2
print(e(3))

 比如上面代码,@d,就等价于e=d(e),d(e)的返回值为f,f在d中是一个函数句柄,e也是一个函数句柄,返回值是正确的,但经过语法糖后,此时的e不再是原来的e,而是d返回的f,再调用e(x),其实是调用f(x),也就是d(f)(x),通过k=f,将传进来的原函数保存至k中,以备后用。所以该装饰器的作用就是将原函数的返回值扩大2倍。

d...
18

打印值如上,证明确实将原函数返回值扩大了2倍。

语法糖也可以带参数,如下代码:

def a(x,y):
    def b(f):
        k=f
        def f(z):
            return x*y*k(z)
        return f
    return b
@a(2,3)
def e(x):
    return x**2
print(e(5))

同样的,@a(2,3)等价于e=a(2,3)(e),说明a(x,y)应该返回一个函数句柄,并且该函数句柄需要将e函数句柄作为参数传入,而这个函数句柄就是代码中的b,也就是说真正的装饰器是b,然后在b中,通过k=f,将传入的原函数句柄保存起来,当调用被包装后的e时,实际是调用了f,而f返回x*y*k(z),即将原函数返回值扩大x*y倍后,再返回。

150

猜你喜欢

转载自www.cnblogs.com/johnyang/p/12173751.html