2010-02-28 80 views
0

我不明白的eval或exec語句執行中什麼樣的環境,你可以通過全局和局部範圍到他們,但我不太明白這意味着什麼。 python會爲它們創建一個匿名模塊嗎?如果是這種情況,全局和本地範圍如何區分?Python的評估和演示執行環境

它運行它喜歡它是一個匿名函數?如果是這樣的話,全局和局部範圍將對我更有意義,但是您是否仍需要調用global var來防止python在賦值時創建局部變量?

這裏是一些代碼來證明什麼,我實際上是試圖做。

# module level vars 
result = '' 

allowed_builtins = {"__builtins__":{'int':int, 'str':str, 'range':range, 'dir':dir, 
            'zip':zip 
}, 
        "result":result} 

def _exec(self, answer, function_name, input): 
    global result 
    exec_string = answer + '\n' 
    exec_string += 'global result; result = %s(%s)' % (function_name, input) 
    exec exec_string in allowed_builtins, {} 

    return result 

我想在我的範圍VAR結果能夠從EVAL/Exec的範圍內。

問問題!!!!!!!!!

回答

2

的「本地」在字典中,所有的名字被一個execeval期間設置; 「全局」一個用於在「本地」一個找不到名字的查找,但除非你exec荷蘭國際集團的代碼,包括global聲明名稱不設在那裏。

無模塊對象由要麼evalexec本質上創建的,也不是任何函數對象,匿名或以其他方式(再次,當然:除非你exec語句,如def等)。

編輯:例如,考慮到OP的代碼,並假設_exec是因爲OP的給予沒有class那裏可以過上獨立的功能,在結尾處加上:

print 'one: %r' % _exec(None, '"foo"', 'range', 7) 
print 'two: %r' % allowed_builtins['result'] 

和你會看到這樣的輸出:

one: '' 
two: [0, 1, 2, 3, 4, 5, 6] 

在當前模塊的__dict__result當然不會受到影響(它是如何可以想象,因爲該字典不會傳遞到相關exec?!) - 在allowed_builtins字典是當然的一個影響,因爲它是爲「全球詞典」,通過了字典,有一個global聲明字符串是exec

+0

謝謝,我明白我現在做錯了什麼。 – jacob 2010-02-28 19:50:47