2012-05-25 117 views
2

假設一個ast節點可以自行評估,但不足以滿足例如ast.literal_eval等。列表理解將ast節點轉換爲python對象

src = '[i**2 for i in range(10)]' 
a = ast.parse(src) 

現在a.body[0]ast.Expra.body[0].valueast.ListComp。我想獲得eval(src)將導致的列表,但只給出ast.Expr節點。

回答

2

也許您在尋找compile()?在AST對象上調用compile()的結果是一個可以傳遞給eval()的代碼對象。


>>> src = '[i**2 for i in range(10)]' 
>>> b = ast.parse(src, mode='eval') 
>>> eval(compile(b, '', 'eval')) 
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 
+0

我試過,但似乎並沒有得到它的工作。例如。 'compile(a.body [0],'','eval')'給出錯誤'expected expression node,got Expr'。 (Expr'不只是'Expression'的縮寫嗎?) –

+0

否 - 'Expr'是'Expression'的主體中包含的內容。嘗試傳遞'a'而不是'a.body [0]'。 (來自[語法](http://docs.python.org/library/ast.html#abstract-grammar)。) – Amber

+1

嘗試使用'ast.parse(src,mode ='eval')'得到'表達式'對象。 – Amber