我有一個包含一行或多行(可信)Python代碼的字符串,我想exec()
該塊,同時捕獲結果最後一行。更具體地說,我想一個函數exec_then_eval
返回以下內容:Python:exec()代碼塊和eval()最後一行
code = """
x = 4
y = 5
x + y
"""
assert exec_then_eval(code) == 9
有兩件事情我已經試過:
通過分割關閉的最後一行,則可以執行的是第一塊,然後評估最後一行;例如
def exec_then_eval(code): first_block = '\n'.join(code.splitlines()[:-1]) last_line = code.splitlines()[-1] globals = {} locals = {} exec(first_block, globals, locals) return eval(last_line, globals, locals)
這是有效的,但如果最後一條語句有多行,則會失敗。
如果代碼本身被修改以便結果存儲爲本地變量,則可以恢復此變量;例如
code = """ x = 4 y = 5 z = x + y """ globals = {} locals = {} exec(code, globals, locals) assert locals['z'] == 9
再次,這工作,但只有當你能夠首先解析代碼塊在一般的方式,並適當地修改它。
有沒有簡單的方法來寫一般的exec_and_eval
函數?
我不認爲會有一個簡單的方法來做到這一點,雖然你也許能夠得到的地方使用https://docs.python.org/2/library/ast.html –
你的輸入看起來像這樣的任何特定原因? – user2357112
重複? http://stackoverflow.com/q/33908794/2301450 – vaultah