2016-04-18 6 views
0

私はPython 2.7とPython 3の両方で動作するPythonプログラムを書こうとしています。私はStringIOを使用し、Python-Future's cheatsheet on StringIOによれば、私がしなければならないのは、Python 3スタイルのioモジュールを使用することだけです。Python 2/3でio.StringIOにfloatを印刷する

問題は、私はprintこのStringIOfloatsをINGのだということです。

from __future__ import print_function 
from io import StringIO 

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

これは私がu"AAAA"unicode_literals持つか"AAAA"が有効)1.0で交換すると

TypeError: string argument expected, got 'str' 

になり、それを正常に動作します。私が試した

代替:

  • BytesIO。 "unicodeはバッファインターフェイスをサポートしていない"ため、私はもうprintできません。
  • "{:f}".format(...)すべてfloat。これは可能ですが、面倒です。
  • file.write(...)print(..., file=file)の代わりに。これはうまくいきますが、現時点では、私はprint()の使用が何であるか分かりません。

その他のオプションはありますか?

+0

"* print()の使用がもう見られない*":なぜそれが問題になるのでしょうか?なぜ 'file.write()'を使わないのですか?ところで、Python 2で 'file'という変数を持つのは悪い考えです。なぜなら、システムが提供する関数をマスクしているからです(あなたの問題には関係ない)。 – cdarke

+2

'' u '{}' 'とは何故でしょうか? –

+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 

これは(import sはファイルの先頭にあるべきである)によってPEP008を破るが、個人的に私はそれが正当化されると思います。

+0

私が 'io.StringIO'をとったもう一つの理由は、' 'StringIO.StringIO'が' with'でうまくいっていないからです」(http://stackoverflow.com/questions/12028637/pythons-stringio-doesnt-do- well-with-with-statements): '__exit__'を実装していません。そのためには、 'try' /' finally'を明示的に明示しなければなりません。 –

+0

@Rymoid:壁から外れていますが、py3to2.pyがそれをどうしているのだろうか? https://pypi.python.org/pypi/py3to2/0.2.0 – cdarke