2016-08-15 34 views
-4

我試圖這樣做如何ast.Tuple轉換到一個列表

mylist = list(mytuple) 

但是,我得到一個錯誤Tuple object is not iterable向ast.Tuple轉換成一個列表。有沒有辦法將這個元組轉換成列表?

有問題的元組是Tupleast對象,其中一個是ast.Str類型,另一個是ast.Name。我的最終目標是創建兩個字符串。但是,可能會出現元組中有兩個以上元素的情況,所以我需要遍歷元組來檢查每個元素是什麼類型的對象。

這是從Python解釋器的錯誤信息

TypeError: 'Tuple' object is not iterable 

這是產生錯誤

if type(foo) is ast.Tuple: 
    g = list(foo) 
+0

@MartijnPieters是的,看起來像他們從異常消息中刪除引號。我得到TypeError:'Tuple'對象不可迭代。 –

+0

@MartijnPieters我不同意你對問題的描述爲「脫離主題」。可能有信息缺失,但這似乎是一種極端和不平衡的反應。無論如何,因爲我將在OP中更新,對象的類型是ast.Tuple:'如果type(foo)是ast.Tuple:',這可以解釋爲什麼它不可迭代。 – Leahcim

+0

@Leahcim:問題很容易重新打開。您的問題不完整,無法以當前的形式回答。它是無關緊要的。 –

回答

2

你不必一個tuple。你有一個ast.Node subclass。這個確實很重要,,AST節點代表一個分析樹,儘管ast.Tuple可能在運行Python代碼中產生一個tuple()實例,那麼關係就結束了。分析樹是源代碼和字節碼之間的中間階段,只有執行字節碼產生實際的元組。

AST節點類只具有ast模塊文檔中記錄的屬性,且不可迭代。您可以訪問_fields,linenocol_offset屬性,其中_fields是可迭代的。

對於特定的ast.Node子類,請參閱Abstract Grammar section以查看該節點傳入哪些其他類型的節點以及可以訪問哪些其他對象的名稱。對於ast.Tuple即語法爲:

Tuple(expr* elts, expr_context ctx) 

所以eltsctx將作爲兩個屬性,並elts是一個序列爲好。順便提一下,ast.Node._fields屬性也會命名這些屬性。

如果您正在查找分析到樹中的元組的「內容」,請查看elts;這已經是一個列表:

>>> import ast 
>>> tree = ast.parse('("foo", bar)') 
>>> tree.body[0].value 
<_ast.Tuple object at 0x10262f990> 
>>> tree.body[0].value._fields 
('elts', 'ctx') 
>>> tree.body[0].value.elts 
[<_ast.Str object at 0x10262f910>, <_ast.Name object at 0x10262f6d0>] 
-1

代碼,您可以使用

mylist = [x for x in mytuple] 
+4

這是什麼'list()'已經*做*。 OP實際上並沒有內置的'tuple'實例。 –