装饰器返回一个函数并接受一个参数

时间:2012-05-05 06:52:25

标签: decorator python-2.7

我不是最好的装饰者,我正在尝试为任务建立一个(显然)。基本上我有我想要装饰的功能(这是一个Django应用程序,但它应该没关系)

def foo(request, param):
    # do something w/ param

现在我需要构建一个装饰器来接受一个参数:

@mydecorator('VALUE')
def foo(request, param)
    pass

所以基本上我需要我的装饰者接受值foo,对请求做一些工作,然后返回

这是我到目前为止所做的,但它不起作用:(

def mydecorator(val):
    @wraps(function)
    def decorator(request, *args, **kwargs):
        # do something with request with respect to val
        return function(request, *args, **kwargs)
    return decorator

需要帮助,谢谢

1 个答案:

答案 0 :(得分:2)

除了foo最后遗漏':'的第二个示例定义之外,主要问题是mydecorator应该返回一个装饰器,因为它是一个函数调用。

如果mydecorator不接受争论你会写:

@mydecorator
    def foo(request, param)
        pass

而不是

@mydecorator()
    def foo(request, param)
        pass

鉴于您应该从以下知识开始:

from functools import wraps

def mydecorator(val):
    def myrealdecorator(function):
        @wraps(function)
        def decorator(request, *args, **kwargs):
            # do something with request with respect to val
            print 'I know about', val
            return function(request, *args, **kwargs)
        return decorator
    return myrealdecorator

@mydecorator('VALUE')
def foo(request, param):
    print 'inside foo'

foo('arg1', 'arg2')