说我有一个功能,看起来像这样:使用装饰带来变数成装饰功能的命名空间
def func(arg1, arg2):
return arg1 + arg2 + arg3
而且我想用传送到一个装饰的论点arg3
带来。这是可能的,如果是的话,这将如何完成?
我已经试过这其中有人建议here能够传递参数给装饰:
from functools import wraps
def addarg(arg):
def decorate(func):
arg3 = arg
@wraps(func)
def wrapped(*args):
return func(*args)
return wrapped
return decorate
@addarg(3)
def func(arg1, arg2):
return arg1 + arg2 + arg3
if __name__ == "__main__":
print(func(1, 2))
但我得到这个错误(可以理解):
Traceback (most recent call last):
File "C:/Users/pbreach/Dropbox/FIDS/PhD/Code/anemi3/utils.py", line 19, in <module>
print(func(1, 2))
File "C:/Users/pbreach/Dropbox/FIDS/PhD/Code/anemi3/utils.py", line 9, in wrapped
return func(*args)
File "C:/Users/pbreach/Dropbox/FIDS/PhD/Code/anemi3/utils.py", line 16, in func
return arg1 + arg2 + arg3
NameError: name 'arg3' is not defined
对于我的应用程序它会这样可以更好地定义函数。还有其他方法,但是更多的代码将不得不被添加到每个函数的主体中。
*为什么*你想这样做?你试图解决的实际问题是什么?这对我来说似乎是一个难以理解的代码。 – jonrsharpe
密切相关:[获取要在with语句中执行的命令块](http://stackoverflow.com/q/12485837);那里的解决方案也适用于装饰器,因为'arg3'只能作为全局来使用。 –
我试图让用户定义一个常微分方程系统作为一系列功能,以与现有软件类似的方式进行整合。 – pbreach