2016-04-18 11 views
0

Ich versuche, ein Python-Programm zu schreiben, das in Python 2.7 und Python 3 funktioniert. *. Ich habe einen Fall, wo ich StringIO verwenden, und nach Python-Future's cheatsheet on StringIO, alles, was ich habe, ist, das Python 3-style io Modul zu verwenden.Drucken schwebt auf io.StringIO in Python 2/3

Das Problem ist, dass ich print ing floats dieser StringIO:

from __future__ import print_function 
from io import StringIO 

with StringIO() as file: 
    print(1.0, file=file) 

Dies führt zu

TypeError: string argument expected, got 'str' 

Wenn ich ersetzen 1.0 durch u"AAAA" (oder "AAAA" mit unicode_literals aktiviert ist), es funktioniert gut.

Alternativen Ich habe versucht:

  • BytesIO. Ich kann nicht mehr print, weil "unicode die Pufferschnittstelle nicht unterstützt".
  • "{:f}".format(...) alle float. Dies ist möglich, aber umständlich.
  • file.write(...) anstelle von print(..., file=file). Das funktioniert, aber an dieser Stelle sehe ich nicht mehr, was print() mehr ist.

Gibt es noch andere Optionen?

+0

"* Ich sehe die Verwendung von' print() 'nicht mehr *": Warum sollte das ein Problem sein? Warum nicht 'file.write()' verwenden? BTW: schlechte Idee, eine Variable namens 'file' in Python 2 zu haben, weil sie eine vom System bereitgestellte Funktion maskiert (nicht mit Ihrem Problem verbunden). – cdarke

+2

Warum nicht einfach "u" {} ". Format (was auch immer)' –

+0

@cdarke Ist 'print' nicht als Bequemlichkeit gedacht? Gibt es nicht eine Möglichkeit, die bequeme Verwendung in Verbindung mit 'StringIO' wiederherzustellen? Ich mag es wirklich nicht, mehr als eine Möglichkeit zu haben, in eine Datei zu schreiben, und 'print' ist derzeit der beste Weg, dies zu tun. –

Antwort

1

Dies ist, was ich mit diesem Thema zu tun:

import sys 

if sys.version_info[0] == 2: # Not named on 2.6 
    from __future__ import print_function 
    from StringIO import StringIO 
else: 
    from io import StringIO 

Dies bricht PEP008 durch die Art und Weise (import s am Anfang der Datei sein soll), aber ich persönlich denke, es gerechtfertigt ist.

+0

Ein anderer Grund warum ich 'io.StringIO' genommen habe ist, dass [' StringIO.StringIO' nicht gut mit 'with'] spielt (http://stackoverflow.com/questions/12028637/python-stringio-doesnt-do- well-with-with-statements): es implementiert nicht '__exit__'. Dafür muss ich einfach "versuchen"/"endlich" explizit. –

+0

@Rymoid: von der Wand, aber ich frage mich, was py3to2.py davon macht? https://pypi.python.org/pypi/py3to2/0.2.0 – cdarke