每当我在python中看到一个装饰器时,我总是看到它在函数定义中使用
def logger(func):
def inner(*args, **kwargs): #1
print "Arguments were: %s, %s" % (args, kwargs)
return func(*args, **kwargs) #2
return inner
@logger
def func(x, y=1):
return x * y
func(2) # Returns Arguments were: (2,), {} \n 2
什么是装饰器在函数定义中执行的操作的等效方法,但是允许您在函数调用时调用它,以便可以在有和没有“装饰器”的情况下使用该函数?
(以下是我的希望,虽然我认为你不能用装饰师做,但我使用@
来表明这个想法)
def func(x, y=1):
return x * y
func(2) # returns 2
@logger
func(2) # Returns Arguments were: (2,), {} \n 2
答案 0 :(得分:5)
@logger
时,所有func
装饰都会自动通过logger
到func
。你可以用以下方法模拟:
logger(func)(2)
logger(func)
创建并返回一个新函数,该函数写出日志消息,然后调用func
。此时你只有一个函数引用,然后可以在最后用(2)
调用它。
您还可以创建对该新功能的引用,这样您就不必每次都用logger()
包装它。
f = logger(func)
f(2)
f(3)
f(4)