2017-05-28 41 views
0

代碼:語法錯誤:打印不工作的eval()

eval("print('foobar')") 

輸出:

Traceback (most recent call last): 
    File "Untitled.py", line 30, in <module> 
    eval("print('foobar')") 
    File "<string>", line 1 
    print('foobar') 
     ^
SyntaxError: invalid syntax 

我在做什麼錯?

+1

你的python版本是什麼? – gzc

+0

鑑於它拋出一個'SyntaxError',它是python-2.x。在python 2中,你需要用'exec'來表示像'print'這樣的語句。 – MSeifert

+0

w.r.t.重複項目:我正在投票表決將此事件公開。潛在的副本沒有具體提及'print',因此就互聯網搜索查詢而言,將當前問題打開會有所幫助。 – kfx

回答

2

print是Python 2中的運算符,也是Python 3中的函數。您使用哪個版本?

+0

^這實際上是正確的答案。 'eval'僅適用於表達式。在Python 3中,'print'是一個函數,因此它的使用是一個有效的表達式。在Python 2中,它的使用是一個聲明,而不是表達式,所以它不會評估。請參閱https://stackoverflow.com/questions/22558548/eval-syntaxerror-invalid-syntax-in-python以獲取更多信息 – daveruinseverything

+0

如果您刪除了「您使用的是哪個版本」部分,並說這就是爲什麼它在python上失敗的原因-2.x這將是一個更好的答案。 – MSeifert

+0

使用Python 2,所以我想exec()呢?具有很大的意義,謝謝 –

1

eval計算表達式,而不是語句,所以你需要通過它的print功能,而不是print聲明。默認情況下,print是Python 2中的語句,並且Python 3中不存在print語句。但是,print函數,可通過__future__導入在Python 2的最新版本中使用。 print函數實際上是在Python 2的這些版本中定義的,但它被print語句掩蓋;導入使得print語句不可用,從而暴露了print函數。

演示,關於Python 2.6.6測試:

from __future__ import print_function 

eval("print('foobar')")  

輸出

foobar 

順便說一句,它一般不使用evalexec,除非是個好主意你別無選擇。它們相對較慢,並且如果您將它們傳遞給unsanitized字符串以評估/執行,則存在安全風險。詳情請參閱SO資深人士Ned Batchelder的Eval really is dangerous。要評估簡單的Python文字,你可以使用ast.literal_eval