Seite 1 von 1
cStringIO <-> StringIO
Verfasst: Dienstag 15. Mai 2007, 16:19
von jens
Wir hatten letztens erst da Thema warum man nicht einfach das machen sollte:
Code: Alles auswählen
try:
import cStringIO as StringIO
except ImportError:
import StringIO
Bin gerade über etwas gestolpert. Normalerweise geht das:
Code: Alles auswählen
import StringIO
buffer = StringIO.StringIO()
print isinstance(buffer, StringIO.StringIO)
Das geht allerdings nicht:
Code: Alles auswählen
import cStringIO as StringIO
buffer = StringIO.StringIO()
print isinstance(buffer, StringIO.StringIO)
Denn:
TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types
Mein konkretes Problem damit löse ich aber ganz ohne isinstance()

Re: cStringIO <-> StringIO
Verfasst: Dienstag 15. Mai 2007, 17:19
von birkenfeld
jens hat geschrieben:Wir hatten letztens erst da Thema warum man nicht einfach das machen sollte:
Code: Alles auswählen
try:
import cStringIO as StringIO
except ImportError:
import StringIO
Natürlich macht man das nicht. Warum zum Teufel sollte das irgendwas bringen?
Verfasst: Dienstag 15. Mai 2007, 17:50
von BlackJack
Weil man mit Jython `cStringIO` nicht importieren kann!?
Verfasst: Dienstag 15. Mai 2007, 17:55
von birkenfeld
Tja, Jython... wer auf Jython lauffähigen Code schreiben muss, der muss auf so viele andere Features verzichten, dass er auch gleich StringIO nehmen kann.
Fakt ist jedenfalls, dass cStringIO und StringIO zwar das gleiche Interface, aber nicht die gleiche Funktionalität bieten.
Verfasst: Mittwoch 16. Mai 2007, 07:02
von jens
Ist es denn normal, das man nicht isinstance() bei cStringIO verwenden kann?
Verfasst: Mittwoch 16. Mai 2007, 07:17
von birkenfeld
Was heißt "normal"? cStringIO.StringIO ist halt eine Factory-Funktion, da je nachdem, ob du einen String mitgibst oder nicht, eine andere Klasse instanziert wird.
Verfasst: Mittwoch 16. Mai 2007, 08:40
von jens
Naja, was im Hintergrund passiert ist mir eigentlich egal
Wie bekomme ich raus, ob ein Objekt nun ein cStringIO ist oder nicht? Am besten sogar ob ein Objekt cStringIO oder StringIO ist oder nicht.
Ich könnte prüfen ob die Methode getvalue() vorhanden ist. Oder ich greife einfach darauf zu, innerhalb von try-except?
Wobei... Das ist nur ein Gedankliches Problem... Ich mache es ja mittlerweile anders

Verfasst: Mittwoch 16. Mai 2007, 13:09
von birkenfeld
Code: Alles auswählen
>>> dir(cStringIO)
['InputType', 'OutputType', 'StringIO', '__doc__', '__file__', '__name__', 'cStringIO_CAPI']
--> auf InputType (nur lesbar) oder OutputType (auch schreibbar) testen.
Verfasst: Mittwoch 16. Mai 2007, 14:07
von mitsuhiko
Bzw nicht cStringIO verwenden. Man braucht das relativ selten, meistens tuts StringIO auch, und das kann auch mit unicode.