1
以下是2個代碼片段。Python的變量範圍爲exec?
我想複製f1
的效果,其中外部變量x
由內部函數g
修改。
然而,代替定義內部函數g
,g
是通過執行/解釋字符串獲得的。
代碼:
def f1():
x = []
def g():
x.append(1)
g()
print x
def f2():
x = []
strr = "def g():\n x.append(1)\n"
exec(strr)
locals()["g"]()
print x
在f1
我得到[1]作爲打印出來,但在f2
我得到x undefined
錯誤。我想知道如何使字符串定義的函數g
中的變量x
可訪問。
跟進:
如果我想將修飾器應用於g,會發生什麼?說我有一個「超時」裝飾一個失敗的功能,如果時間過長運行:
def f1():
x = []
@timeout(1)
def g():
x.append(1)
g()
print x
編輯:我設法如下解決這個問題,因爲超時不是本地定義,我必須移動定義從全球到地方的超時時間,照常進行。
def f2():
x = []
strr = "@timeout(1)\ndef g():\n x.append(1)\n"
locals()['timeout'] = globals()['timeout']
exec strr in locals()
locals()["g"]()
print x