1

我不是最好的装饰器,我正在尝试为一项任务构建一个(显然)。基本上我有我想要装饰的功能(这是一个 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

需要帮助,谢谢

4

1 回答 1

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')
于 2012-05-08T17:32:32.060 回答