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

yxwkf 阅读:18 2024-12-31 21:38:35 评论:0

我有一个语法树

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')])]) 

我将其转换为字符串:
if age > 18: 
    if salary > 100000: 
        print('success') 
    elif salary < 50000: 
        print('fail') 
    else:  
        print('get_more_info') 
else: 
    print('fail') 

我声明变量:
age = 20 
salary = 60000 

并尝试执行此代码
eval(code) 

并得到一个错误
File "<string>", line 1 
if age > 18:  
 ^ 
SyntaxError: invalid syntax 

请您参考如下方法:

您正在寻找 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 
exec接受一个代码字符串或一个代码对象。虽然 eval需要一个表达式。

或者,您始终可以通过 compiling 评估(使用 eval)代码对象预先的代码字符串:
eval(compile(code, '<string>', 'exec'), {"age": 20, "salary": 60000}) 
# out: get_more_info 

只是为了好玩,您可以使用 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 

这利用了 Python 的 ternary条件,这在技术上仍被视为表达式。


标签:Python
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号