2015-07-12 50 views
1

我有這個代碼:Python的EXEC()的問題

def test(variable, customCode = ""): 

    if variable > 1: 
     print(">1") 

    if customCode != "": 
     exec(customCode) 

    if foo == 1: 
     print("Success") 

numb = 12 
code = "if variable > 1: foo = 1" 

test(numb, code) 

在執行時,給出了這樣的錯誤:

Error 1

所以,後來,我在的開頭加入foo = 0代碼,並得到這個輸出:

Issue 2

現在,顯然,它也應該是輸出Success,但它不是。

這是什麼問題?

使用Python 3

+0

代碼執行得很好,使用'> 1'然後換行符和'Success'。 –

+0

@ l'L'l,你使用python3嗎? –

+0

@PadraicCunningham,我嘗試了'2.7.6'和'3.4.3'(在Python3中它失敗了),對不起,我沒有提到。你的回答讓我好奇 - 是否會被視爲一種範圍界定? –

回答

3

正確的方法是通過一個字典的關鍵在Python 3和查找給exec,在python2您的代碼將作爲工作是因爲高管是不是在python3函數的聲明:

def test(variable, customCode = ""): 
    d = {"variable":variable} 
    if customCode != "": 
     exec(customCode, d) 
    if d["foo"] == 1: 
     print("Success") 

numb = 12 
code = "if variable > 1: foo = 1" 

test(numb, code) 

輸出:

In [13]: numb = 12 

In [14]: code = "if variable > 1: foo = 1" 

In [15]: test(numb, code) 
Success 

exec

Note The default locals act as described for function locals() below: modifications to the default locals dictionary should not be attempted. Pass an explicit locals dictionary if you need to see effects of the code on locals after function exec() returns.

您還需要了解您的if variable > 1爲False的情況,因爲您永遠不會執行代碼,所以foo永遠不會被添加。

+1

好的,你的回答讓我想到我的解決方案,我即將發佈。謝謝。 – Quelklef

0

閱讀@Padraic坎寧安的崗位給了我一個想法,它曾作爲一個解決方案:

很簡單:不是隻是在做: foo = 1,做到: global foo; foo = 1

更改代碼:

def test(variable, customCode = ""): 

    if variable > 1: 
     print(">1") 

    if customCode != "": 
     exec(customCode) 

    if foo == 1: 
     print("Success") 

numb = 12 
code = "if variable > 1: global foo; foo = 1" 

test(numb, code) 

問題是exec()是一個函數,而不是在Python 3一份聲明中,所以foo被用作局部變量。 (來源:@Padraic Cunningham)