說我有一個功能,看起來像這樣:使用裝飾帶來變數成裝飾功能的命名空間
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