簡體   English   中英

Python Eval執行環境

[英]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結果。

“本地”字典是在execeval期間設置所有名稱的地方; “全局”名稱用於查找在“本地”名稱中找不到的名稱,但是除非您正在exec包含global語句的代碼,否則不會在其中設置名稱。

evalexec不會本質上創建模塊對象,匿名或其他方式也不會創建任何函數對象(當然,當然:除非您exec defexec語句)。

編輯 :例如,給定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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM