Search code examples
pythonpython-2.7stringio

printing floats to io.StringIO in Python 2/3


I'm trying to write a Python program that works in both Python 2.7 and Python 3.*. I have a case where I use StringIO, and according to Python-Future's cheatsheet on StringIO, all I have to to is to use the Python 3-style io module.

The problem is that I'm printing floats to this StringIO:

from __future__ import print_function
from io import StringIO

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

This results in

TypeError: string argument expected, got 'str'

When I replace 1.0 by u"AAAA" (or "AAAA" with unicode_literals enabled), it works fine.

Alternatives I've tried:

  • BytesIO. I can't print anymore, because "unicode doesn't support the buffer interface".
  • "{:f}".format(...) every float. This is possible, but cumbersome.
  • file.write(...) instead of print(..., file=file). This works, but at this point, I don't see what the use of print() is anymore.

Are there any other options?


Solution

  • This is what I do with this issue:

    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
    

    This breaks PEP008 by the way (imports should be at the top of the file), but personally I think it is justified.