![](/img/trans.png)
[英]Changing function code using a decorator and execute it with eval?
[英]Python: using eval to execute code in the string
我有一個語法樹
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
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
表達了。
或者,您始終可以通過預先編譯代碼字符串來評估(使用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的三元條件,從技術上來說仍然算作表達式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.