在函数调用时使用装饰器而不是函数定义

时间:2014-04-08 15:04:49

标签: python function decorator

每当我在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 

1 个答案:

答案 0 :(得分:5)

每当调用@logger时,

所有func装饰都会自动通过loggerfunc。你可以用以下方法模拟:

logger(func)(2)

logger(func)创建并返回一个新函数,该函数写出日志消息,然后调用func。此时你只有一个函数引用,然后可以在最后用(2)调用它。

您还可以创建对该新功能的引用,这样您就不必每次都用logger()包装它。

f = logger(func)
f(2)
f(3)
f(4)