2016-04-18 1 views
0

Я пытаюсь написать программу Python, которая работает как в Python 2.7, так и в Python 3. *. У меня есть случай, когда я использую StringIO, и согласно Python-Future's cheatsheet on StringIO, все, что мне нужно, это использовать модуль Python 3-style io.печать плакатов на io.StringIO в Python 2/3

Проблема заключается в том, что я print ING floatsStringIO к этому:

from __future__ import print_function 
from io import StringIO 

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

Это приводит к

TypeError: string argument expected, got 'str' 

Когда я заменить 1.0 на u"AAAA" (или "AAAA" с unicode_literals включен), его работает отлично.

Альтернативы я пробовал:

  • BytesIO. Я не могу print, потому что «unicode не поддерживает интерфейс буфера».
  • "{:f}".format(...) каждые float. Это возможно, но громоздко.
  • file.write(...) вместо print(..., file=file). Это работает, но на данный момент я не вижу, что использование print() больше.

Есть ли другие варианты?

+0

"* Я не вижу, чтобы использование' print() 'больше *": почему это будет проблемой? Почему бы не использовать 'file.write()'? BTW: плохая идея иметь переменную, называемую 'file' в Python 2, потому что она маскирует предоставленную системой функцию (не связанную с вашей проблемой). – cdarke

+2

Почему не просто 'u" {} ". Format (что угодно)' –

+0

@cdarke Разве 'print' не должно быть удобством? Разве нет способа восстановить его удобное использование в сочетании с 'StringIO'? Мне очень не нравится иметь более одного способа записи в файл, а 'print' в настоящее время является наиболее читаемым способом этого. –

ответ

1

Это то, что я с этим вопросом:

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 

Это нарушает PEP008 по пути (import s должен быть в верхней части файла), но лично я думаю, что это оправдано.

+0

Другая причина, по которой я взял 'io.StringIO', состоит в том, что [' StringIO.StringIO' не играет хорошо с 'with'] (http://stackoverflow.com/questions/12028637/pythons-stringio-doesnt-do- well-with-with-statements): он не реализует '__exit__'. Для этого мне просто нужно «попробовать»/«наконец» явно. –

+0

@ Rymoid: со стены, но мне интересно, что из этого делает py3to2.py? https://pypi.python.org/pypi/py3to2/0.2.0 – cdarke

Смежные вопросы