簡體   English   中英

Python:使用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

你正在尋找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表達了。


或者,您始終可以通過預先編譯代碼字符串來評估(使用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的三元條件,從技術上來說仍然算作表達式。

您將eval()exec()混淆。

eval()用於表達式,例如False==True

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

exec()用於動態執行代碼:

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

exec(s)

輸出:

fail

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM