I try:
def test(w,sli): s = "'{0}'{1}".format(w,sli) exec(s) return s print test("TEST12344","[:2]") its return 'TEST12344'[:2]
How to return value from exec in function
Think of running the following code.
code = """ def func(): print("std out") return "expr out" func() """ If you run func() on the python console, the output would be something like:
>>> def func(): ... print("std out") ... return "expr out" ... >>> func() std out 'expr out' >>> exec(code) std out >>> print(exec(code)) std out None As you can see, the return is None.
>>> eval(code) will produce Error.
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()) exec_with_return(code) 'if True:\n "hello"\nelse:\n "world"' the output is neither "hello", nor "world", but None.def foo(): exec_with_return(code) # exec(code) func() foo() func()exec() doesn't just evaluate expressions, it executes code. You would have to save a reference within the exec() call.
def test(w, sli): exec('s = "{}"{}'.format(w, sli)) return s If you just want to evaluate an expression, use eval(), and save a reference to the returned value:
def test(w,sli): s = "'{0}'{1}".format(w,sli) s = eval(s) return s However, I would recommend avoiding exec() and eval() in any real code whenever possible. If you use it, make sure you have a very good reason to do so.
NameError for sprint as a statement rather than a function, Python 3 is not being used here.