make it a bit clearer where an exception was thrown

This commit is contained in:
Joeri Exelmans 2024-11-25 13:36:26 +01:00
parent a91c7d2bdd
commit ac6334eb84

View file

@ -1,22 +1,33 @@
# based on https://stackoverflow.com/a/39381428 # based on https://stackoverflow.com/a/39381428
# Parses and executes a block of Python code, and returns the eval result of the last statement # Parses and executes a block of Python code, and returns the eval result of the last statement
from concrete_syntax.common import indent
import ast import ast
def exec_then_eval(code, _globals={}, _locals={}): def exec_then_eval(code, _globals={}, _locals={}):
block = ast.parse(code, mode='exec') try:
# assumes last node is an expression block = ast.parse(code, mode='exec')
last = ast.Expression(block.body.pop().value) # assumes last node is an expression
extended_globals = { last = ast.Expression(block.body.pop().value)
'__builtins__': __builtins__, extended_globals = {
**_globals, '__builtins__': __builtins__,
} **_globals,
exec(compile(block, '<string>', mode='exec'), extended_globals, _locals) }
return eval(compile(last, '<string>', mode='eval'), extended_globals, _locals) exec(compile(block, '<string>', mode='exec'), extended_globals, _locals)
result = eval(compile(last, '<string>', mode='eval'), extended_globals, _locals)
return result
except Exception as e:
e.add_note("In the following user code fragment:\n"+indent(code, 4))
raise
def simply_exec(code, _globals={}, _locals={}): def simply_exec(code, _globals={}, _locals={}):
block = ast.parse(code, mode='exec') try:
extended_globals = { block = ast.parse(code, mode='exec')
'__builtins__': __builtins__, extended_globals = {
**_globals, '__builtins__': __builtins__,
} **_globals,
exec(compile(block, '<string>', mode='exec'), extended_globals, _locals) }
exec(compile(block, '<string>', mode='exec'), extended_globals, _locals)
except Exception as e:
e.add_note("In the following user code fragment:\n"+indent(code, 4))
raise