2016-08-25 3 views
1

Ich verwende ast.literal_eval(str), um eine Zeichenfolge auszuwerten, die ein Tupel wie ('a', 'b', 'c') enthält. wenn aus irgendeinem Grunde jedoch nur dieses Tupel ein einzelnes Element enthält, ignoriert der Ausdruck, den die Klammer und gibt nur das Element:literal_eval des Tupels mit einem einzelnen Element

>>> string = "('a')" 
>>> x = ast.literal_eval(string) 
>>> x 
'a' 

Gibt es einen nicht-hackish Weg, dies zu lösen? Dieses Problem wird noch durch die Tatsache verstärkt, dass ich manchmal ein Tupel von Tupeln, wie (('a','b')), habe und als solches nicht einfach nach Typ suchen kann. Vielen Dank!

+1

'(x)' ist kein 1-Tupel. –

Antwort

1

Das ist, weil ('a') kein Tupel ist, sondern eine Zeichenfolge, die als a behandelt wird. Tupels mit nur einem Objekt als ('a',) definiert (man beachte die ,)

>>> type('a') 
<type 'str'> <-- String 
>>> type(('a')) 
<type 'str'> <-- String 
>>> type(('a',)) 
<type 'tuple'> <-- Tuple 
+0

Rechts. Aber mein Ziel ist es, dieses kleine Komma vollständig zu vermeiden; Gibt es einen Weg, das zu tun? – MarEe

+0

Wenn Sie das entfernen, wird es kein Tupel sein. Es ist eine Syntax von Python :) –

+0

Ich hatte Angst davor. Danke aber! – MarEe

Verwandte Themen