[英]Python Eval executing environment
我不了解eval或exec語句在什么環境中執行。您可以將全局范圍和局部范圍傳遞給它們,但我不太理解這意味着什么。 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
我希望可以在eval / exec的范圍內設置我范圍內的var結果。
“本地”字典是在exec
或eval
期間設置所有名稱的地方; “全局”名稱用於查找在“本地”名稱中找不到的名稱,但是除非您正在exec
包含global
語句的代碼,否則不會在其中設置名稱。
eval
或exec
不會本質上創建模塊對象,匿名或其他方式也不會創建任何函數對象(當然,當然:除非您exec
def
等exec
語句)。
編輯 :例如,給定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
當然不會受到影響(可以想象是怎么回事,因為該dict永遠不會傳遞給有問題的exec
?!)- allowed_builtins
字典當然是受影響的那allowed_builtins
,因為它是字典的“全球詞典”過去, 有一個global
的字符串中的語句是exec
貢獻!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.