2016-08-15 7 views
-4

Ich habe versucht, eine ast.Tuple in eine Liste zu umwandeln, indem Sie diesesWie ast.Tuple in eine Liste zu konvertieren

mylist = list(mytuple) 

tun Ich bin jedoch ein Tuple object is not iterable Fehler. Gibt es eine Möglichkeit, dieses Tupel in eine Liste umzuwandeln?

Das Tupel in Frage ist ein Tuple von ast Objekte, von denen eine Art ast.Str, die andere ast.Name ist. Mein ultimatives Ziel ist es, eine Saite der beiden zu erschaffen. Es kann jedoch Situationen geben, in denen mehr als zwei Elemente im Tupel vorhanden sind, so dass ich in der Lage sein muss, über das Tupel zu iterieren, um zu prüfen, welcher Typ von ast Objekt jedes Element ist.

Dies ist die Fehlermeldung aus dem Python-Interpreter

TypeError: 'Tuple' object is not iterable 

Dies ist der Code, der den Fehler erzeugt

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

@MartijnPieters Ja, sieht so aus, als hätten sie die Anführungszeichen aus der Ausnahmebedingungsnachricht entfernt. Ich bekomme 'TypeError: 'Tuple' -Objekt ist nicht iterierbar. –

+0

@MartijnPieters Ich stimme nicht mit Ihrer Charakterisierung der Frage als "Off Topic". es mögen Informationen fehlen, aber das scheint eine extreme und unausgewogene Reaktion zu sein. Auf jeden Fall, wie ich im OP aktualisieren werde, ist das Objekt vom Typ ast.Tuple: 'wenn Typ (foo) ast ist. Tuple:', was erklären kann, warum es nicht iterierbar ist. – Leahcim

+0

@Leahcim: Eine Frage wird leicht wieder geöffnet. Ihre Frage ist unvollständig und kann nicht in der aktuellen Form beantwortet werden. Es ist off-topic. –

Antwort

2

Sie haben nicht nutzen konnten a tuple. Sie haben eine ast.Node subclass. Diese spielt eine Rolle, AST-Knoten stellen einen Syntaxbaum dar, und obwohl ast.Tuple in laufendem Python-Code in eine tuple() Instanz führen kann, endet die Beziehung. Ein Syntaxbaum ist eine Zwischenstufe zwischen Quellcode und Bytecode, und nur der ausgeführte Bytecode erzeugt tatsächliche Tupel.

AST-Knotenklassen haben nur die in der Moduldokumentation ast dokumentierten Attribute und sind nicht iterierbar. Sie können auf die Attribute _fields, lineno und col_offset zugreifen, wobei _fields ein iterabler Wert ist.

Für eine bestimmte ast.Node Unterklasse, konsultieren Sie die Abstract Grammar section, um zu sehen, welche anderen Arten von Knoten für diesen Knoten übergeben werden, und durch welche Namen diese anderen Objekte zugegriffen werden können. Für ast.Tuple dass Grammatik ist:

Tuple(expr* elts, expr_context ctx) 

so elts und ctx als zwei Attribute zur Verfügung stehen werden, und elts ist eine Sequenz als auch. Übrigens nennt das Attribut ast.Node._fields diese Attribute ebenfalls.

Wenn Sie nach dem 'Inhalt' eines Tupels suchen, das in den Baum geparst wurde, suchen Sie nicht weiter als elts; Dies ist bereits eine Liste:

>>> 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

Sie

mylist = [x for x in mytuple] 
+4

Was ist 'list()' schon * *. Das OP hat keine eingebaute Tupel-Instanz. –

Verwandte Themen