一些函数参数可以通过装饰器传递吗?

时间:2016-02-24 10:05:19

标签: python function python-decorators

我有一个功能 -

def add(a, b):
   return a+b

现在我希望它使用装饰器添加100到结果 -

@decorator(100)
def add(a, b):
    return (a+b)

class decorator():
    def __init__(self, c):
        self.c = c

    def __call__(self, f):
        def _wrapped_f(a, b):
            return self.c + f(a, b)
        return _wrapped_f

问题是当我想保留额外的参数变量而不是固定为100时。

像 -

@decorator(c)
    def add(a, b):
        return (a+b)

我可以在函数调用期间以某种方式分配此变量的值。 (调用add函数时) 我想使用装饰器这样做的原因是因为我不想修改我的功能添加。

我无法承担像 -

这样的功能中的额外参数
def(a, b, c=0):
    return (a+b+c)

因此,需要装饰者。

2 个答案:

答案 0 :(得分:1)

不确定。装饰器所做的就是用包装版本替换原始函数;该包装器可以使用任意数量的参数。

我不确定你为什么要使用课程 - 作为标准的装饰师,这会更清晰。

    <select>
      <option value="department"><s:text name="global.option.department"/></option>
      <option value="citizen"><s:text name="global.option.citizen"/></option>
      <option value="other"><s:text name="global.option.other"/></option>
    </select>

答案 1 :(得分:1)

不是100%肯定你想对这个装饰器做什么,所以这可能不是你想要的,但即便如此,其他人可能会觉得它很有用。

可以向该函数添加另一个参数,只需向_wrapped函数添加更多参数,或者将*args**kwargs传递给该函数功能。但是你如何处理这些参数?当然,只是将这些参数添加到结果中仅对add函数有意义。

在一般情况下,您可以使用修饰函数本身来处理其他参数。然后,使用原始函数来设置函数reduce所有参数:

from functools import reduce # Python 3
def vararg(f):
    """ change two-arg-function into vararg-function"""
    def _f(*args):
        return reduce(f, args)
    return _f

@vararg
def add(a, b):
    return a + b

print(add(1, 2))           # ->  3
print(add(1, 2, 3))        # ->  6
print(add(1, 2, 3, 4))     # -> 10
print(add(1, 2, 3, 4, 5))  # -> 15