2016-01-13 80 views
1

以下是2個代碼片段。Python的變量範圍爲exec?

我想複製f1的效果,其中外部變量x由內部函數g修改。

然而,代替定義內部函數gg是通過執行/解釋字符串獲得的。

代碼:

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 

回答

1

您需要爲exec添加名稱空間。使用本地名稱空間(exec strr in locals()),它的工作原理:

def f2(): 
    x = [] 
    strr = "def g():\n x.append(1)\n" 
    exec strr in locals() 
    locals()["g"]() 
    print x 

>>> f2() 
[1]