如何在函数中从exec返回值?

时间:2015-10-29 08:27:13

标签: python string python-2.7 exec

我试试:

def test(w,sli):
    s = "'{0}'{1}".format(w,sli)
    exec(s)
    return s

print test("TEST12344","[:2]")

返回' TEST12344' [:2]

如何从函数中的exec返回值

3 个答案:

答案 0 :(得分:4)

请考虑运行以下代码。

code = """
def func():
    print("std out")
    return "expr out"
func()
"""

在Python控制台上

如果您在python控制台上运行func(),则输出将类似于:

>>> def func():
...     print("std out")
...     return "expr out"
...
>>> func()
std out
'expr out'

使用exec

>>> exec(code)
std out
>>> print(exec(code))
std out
None

如您所见,返回值为None。

使用评估

>>> eval(code)

会产生错误。

所以我做了exec_with_return()

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)

答案 1 :(得分:3)

1>main.obj : error LNK2001: unresolved external symbol _DirectDrawCreate@12 1>Sound.obj : error LNK2001: unresolved external symbol __imp__mmioRead@12 1>Sound.obj : error LNK2001: unresolved external symbol __imp__mmioOpenA@12 1>Sound.obj : error LNK2001: unresolved external symbol __imp__mmioClose@8 1>Sound.obj : error LNK2001: unresolved external symbol __imp__mmioAdvance@12 1>Sound.obj : error LNK2001: unresolved external symbol __imp__mmioAscend@12 1>Sound.obj : error LNK2001: unresolved external symbol __imp__mmioSetInfo@12 1>Sound.obj : error LNK2001: unresolved external symbol __imp__mmioDescend@16 1>Sound.obj : error LNK2001: unresolved external symbol __imp__mmioGetInfo@12 不只是评估表达式,而是执行代码。您必须在exec()调用中保存参考

exec()

如果您只想评估表达式,请使用def test(w, sli): exec('s = "{}"{}'.format(w, sli)) return s ,并保存对返回值的引用:

eval()

但是,我建议尽可能避免在任何实际代码中使用def test(w,sli): s = "'{0}'{1}".format(w,sli) s = eval(s) return s exec()。如果您使用它,请确保您有充分的理由这样做。

答案 2 :(得分:0)

我在2020年的python 3.8中的发现

在评估逻辑中:

a="1+99"
a=eval(a)
print(a) # output: 100

执行逻辑

exec ("a=33+110")
print(a) #output 143