我有一个功能 -
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)
因此,需要装饰者。
答案 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