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

2024-06-01 11:35:21 发布

您现在位置: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')])])

我把它转换成字符串:

^{pr2}$

我声明变量:

age = 20
salary = 60000

试着用

eval(code)

然后得到一个错误

File "<string>", line 1
if age > 18: 
 ^
SyntaxError: invalid syntax

Tags: tokentreenumberagestringifactionresult
2条回答

您将^{}与{a2}混淆。在

eval()用于表达式,例如False==True

>>> eval('False==True')
False

exec()用于动态执行代码:

^{pr2}$

输出:

fail

您要找的是^{}而不是{a2}:

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)代码对象:

^{pr2}$

为了好玩,您可以使用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条件,从技术上讲,它仍然被视为一个表达式。在

相关问题 更多 >