Skip to content

Instantly share code, notes, and snippets.

@KTakahiro1729
Last active September 17, 2018 06:42
Show Gist options
  • Save KTakahiro1729/8180cac2ebda86c70d0dd0aa31255589 to your computer and use it in GitHub Desktop.
Save KTakahiro1729/8180cac2ebda86c70d0dd0aa31255589 to your computer and use it in GitHub Desktop.
exec with value return if the last is expression
import ast
import copy
def convertExpr2Expression(Expr):
Expr.lineno = 0
Expr.col_offset = 0
result = ast.Expression(Expr.value, lineno=0, col_offset = 0)
return result
def exec_with_return(code):
code_ast = ast.parse(code)
init_ast = copy.deepcopy(code_ast)
init_ast.body = code_ast.body[:-1]
last_ast = copy.deepcopy(code_ast)
last_ast.body = code_ast.body[-1:]
exec(compile(init_ast, "<ast>", "exec"), globals())
if type(last_ast.body[0]) == ast.Expr:
return eval(compile(convertExpr2Expression(last_ast.body[0]), "<ast>", "eval"),globals())
else:
exec(compile(last_ast, "<ast>", "exec"),globals())
code = """
a = 3
print(a)
a = a+1
a
"""
exec_with_return(code)
# stdout: 3
# Out[1]: 4
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment