【问题标题】:Decorator Which Returns a function and Accepts a Parameter返回函数并接受参数的装饰器
【发布时间】:2012-05-05 06:52:25
【问题描述】:

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

需要帮助,谢谢

【问题讨论】:

  • 第二个代码块末尾缺少一个 ':'。我无法编辑它,因为在一次编辑中至少需要 6 个非空格字符

标签: decorator python-2.7


【解决方案1】:

除了 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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-03
    • 2020-04-02
    • 2015-08-14
    • 2013-12-05
    • 2017-05-26
    • 2019-05-13
    • 1970-01-01
    • 2020-04-28
    相关资源
    最近更新 更多