Python:使用eval执行字符串中的代码

Pet*_*rov 5 python

我有一个语法树

Tree(if, [Tree(condition, [Token(VARIABLE, 'age'), Token(ACTION_OPERATOR, '>'), Token(SIGNED_NUMBER, '18')]), Tree(result, [Tree(if, [Tree(condition, [Token(VARIABLE, 'salary'), Token(ACTION_OPERATOR, '>'), Token(SIGNED_NUMBER, '100000')]), Tree(result, [Token(STRING, 'success')]), Tree(condition, [Token(VARIABLE, 'salary'), Token(ACTION_OPERATOR, '<'), Token(SIGNED_NUMBER, '50000')]), Tree(result, [Token(STRING, 'fail')]), Tree(else, [Token(STRING, 'get_more_info')])])]), Tree(else, [Token(STRING, 'fail')])])
Run Code Online (Sandbox Code Playgroud)

我将其转换为字符串:

if age > 18:
    if salary > 100000:
        print('success')
    elif salary < 50000:
        print('fail')
    else: 
        print('get_more_info')
else:
    print('fail')
Run Code Online (Sandbox Code Playgroud)

我声明变量:

age = 20
salary = 60000
Run Code Online (Sandbox Code Playgroud)

并尝试执行此代码

eval(code)
Run Code Online (Sandbox Code Playgroud)

并得到一个错误

File "<string>", line 1
if age > 18: 
 ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

abc*_*ccd 4

您正在寻找的exec不是eval

code = """
if age > 18:
    if salary > 100000:
        print('success')
    elif salary < 50000:
        print('fail')
    else: 
        print('get_more_info')
else:
    print('fail')"""

exec(code, {"age": 20, "salary": 60000})
# out: get_more_info
Run Code Online (Sandbox Code Playgroud)

exec接受一个代码字符串或一个代码对象。Whileeval需要一个表达式。


或者,您始终可以通过预先编译代码字符串来评估(使用eval)代码对象:

eval(compile(code, '<string>', 'exec'), {"age": 20, "salary": 60000})
# out: get_more_info
Run Code Online (Sandbox Code Playgroud)

只是为了好玩,您可以使用eval语法树而无需编译代码,但您的代码必须有点不同:

code = 'print(("success" if salary > 100000  else "fail" if salary < 50000 else "get_more_info") if age > 18 else "fail")'

eval(code, {"age": 20, "salary": 60000})
# out: get_more_info
Run Code Online (Sandbox Code Playgroud)

这利用了 Python 的三元条件,从技术上讲,它仍然被算作一个表达式。