我有一个语法树
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)
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 的三元条件,从技术上讲,它仍然被算作一个表达式。
| 归档时间: |
|
| 查看次数: |
2239 次 |
| 最近记录: |