2009-12-24 65 views

回答

3

用途:

eval(compile(a,'<string>','exec')) 

代替:

eval(repr(a)) 

成績單:

>>> a='''b="ddd"''' 
>>> eval(compile(a,'<string>','exec')) 
>>> print str(a) 
b="ddd" 
>>> print b 
ddd 

問題是,您實際上正在執行語句'b="ddd"',該語句不是b的賦值,而是字符串的評估。

eval()內置的,當給定一個字符串時,將其評估爲表達式(不是語句)並返回結果。您可以通過爲其提供一個代碼對象來運行非表達式代碼eval(),我們使用上面的compile()創建代碼對象。在這種情況下,它將運行代碼並返回None

你可以看到一個類似的效果,如果你只需要輸入:

>>> 'c=7' 
'c=7' 
>>> c 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'c' is not defined 
>>> c=7 
>>> c 
7 
>>> '7=d' 
'7=d' 
>>> 7=d 
    File "<stdin>", line 1 
SyntaxError: can't assign to literal 

顯然7=d不是有效的Python,但'7=d'是,由於以上原因解釋。

expr()repr()compile()內置插件的描述,足以足以工作了這一點,發現here。在做出這個答案的過程中,沒有任何內建損害。

+0

參見:http://docs.python.org /reference/simple_stmts.html#exec – Miles 2009-12-24 07:40:52

2

eval用於評估(得到結果)表達式。你想要的是一個Python代碼,這是與exec進行動態執行:

>>> a='''b="ddd"''' 
>>> exec(a) 
>>> print b 
ddd 

還要注意的是,你不應該叫再版()的字符串傳遞給任何函數之前。你已經有一個字符串,調用repr()創建一個字符串的字符串表示形式。

0

重新考慮您是否確實需要使用eval()。例如,你可以使用globals()這樣的:

>>> globals()['b'] = 'ddd' 
>>> print b 
ddd 

但是,也許你應該使用什麼只是一個dictionary

>>> my_namespace = dict() 
>>> my_namespace['b'] = 'ddd' 
>>> my_namespace 
{'b': 'ddd'} 
>>> print my_namespace['b'] 
ddd