eval.py 1.2 KB

12345678910111213141516171819202122232425262728293031323334
  1. # based on https://stackoverflow.com/a/39381428
  2. # Parses and executes a block of Python code, and returns the eval result of the last statement
  3. from concrete_syntax.common import indent
  4. import ast
  5. def exec_then_eval(code, _globals={}, _locals={}):
  6. try:
  7. block = ast.parse(code, mode='exec')
  8. # assumes last node is an expression
  9. last = ast.Expression(block.body.pop().value)
  10. extended_globals = {
  11. '__builtins__': __builtins__,
  12. **_globals,
  13. }
  14. exec(compile(block, '<string>', mode='exec'), extended_globals, _locals)
  15. result = eval(compile(last, '<string>', mode='eval'), extended_globals, _locals)
  16. return result
  17. except Exception as e:
  18. e.add_note("In the following user code fragment:\n"+indent(code, 4))
  19. raise
  20. def simply_exec(code, _globals={}, _locals={}):
  21. try:
  22. block = ast.parse(code, mode='exec')
  23. extended_globals = {
  24. '__builtins__': __builtins__,
  25. **_globals,
  26. }
  27. exec(compile(block, '<string>', mode='exec'), extended_globals, _locals)
  28. except Exception as e:
  29. e.add_note("In the following user code fragment:\n"+indent(code, 4))
  30. raise