2016-03-11 7 views
6

私は生のバイナリデータを格納するためにstrを大いに利用するPython2コードベースを持っています。 Python2とPython3の両方をサポートしたい。Python 2と3をサポートしています:str、bytesまたはalternative

Python2で(別名:str)タイプとbytesタイプが全く異なります。それらは、構成するために異なる引数をとり、異なるタイプのインデックスを持ち、異なるstrreprを持っています。

両方のPythonバージョンのコードを統一するための最良の方法は、1つのタイプを使用して生データを保存することです。私はあなたがバイトで仕事をしたいものを部品には分からない

+0

なぜ、 'str'に固執するだけではないのですか?バージョン間でも同じですよね? – zondo

+1

@ zondo:いいえ、そうではありません。 Python 3の 'str'は、' 2の 'unicode'とほぼ同じです。Python 3の' str'に生のバイナリデータを格納することはできません。 –

+4

'b '..'残りのケースを処理するには 'six'のようなブリッジライブラリを使用します。 –

答えて

0

、私allmostはオールウェイズのByteArrayのと協力し、このファイルから

with open(file, 'rb') as imageFile: 
    f = imageFile.read() 
    b = bytearray(f) 

を読んだとき、私はそれを行う方法である私は、右のアウトということをしました私が取り組んでいるプロジェクトは、2と3の両方で動作します。あなたが見るべき何かがありますか?

+1

これは、この問題に対処するための効率的な方法ではありません。たくさんのプロジェクトが 'str'を2で、' bytes'を3で使うことができます。 –

+2

'bytearray'は残念ながら変更可能です。不変性は私には重要です – slezica

0

プロジェクトが小さくてシンプルな場合は、sixを使用してください。

それ以外の場合は、Python 2用とPython 3用の2つの独立したコードベースを用意することをお勧めします。最初は多くの不必要な作業のように聞こえるかもしれませんが、実際は維持するのがもっと簡単です。

あなたが1つのコードベースで両方のpythonをサポートすることを決めた場合のプロジェクトの例として、googleのprotobufをご覧ください。多くの場合、直感的で分かりにくい分岐が多数あり、ハックを許可するために変更された抽象クラスがあります。そして、あなたのプロジェクトが進化するにつれて、それはより良くならないでしょう:デッドラインは、コードの品質に対して果たします。

2つの別々のコードベースを使用すると、単一のコードベースが必要な場合は、先行するものと比較して多くの作業が行われないほぼ同一のパッチを適用するだけです。また、Python 2のユーザー数が一度減少すると、Python 3への移行が容易になります。

+0

'そして、あなたはおそらく1年かそこらでPython 2のバージョンを落とすでしょう。どうしてそんなに確かなことができますか?個人的に私は何度も3.xに触れることはありません。同じことを感じる人がたくさんいます。 Python 3.xを使いたくない、または使用できない理由はたくさんあります。 –

+0

私はこれを私の答えから削除します。攻撃的ではありませんでした。新しいプロジェクトにPython 2が必要ない理由を話し合おうと思ったら、チャットでこれをやりましょう。 – Kentzo

+0

大きなプロジェクトのコードベースを分ける?それは単なる維持できないものです。 –

0

あなただけのPython 2.6以降をサポートする必要があると仮定すると、あなたは、単にのためbytesを使用することができ、うまく、バイト。 b'\x0a\x0b\x00'などのバイトオブジェクトを作成するには、bリテラルを使用します。ファイルを操作する場合は、bopen('file.bin', 'rb')のように)が含まれていることを確認してください。
ただし、反復と要素アクセスが異なることに注意してください。このような場合、チャンクを使用するコードを記述することができます。 b[0] == 0(Python 3)またはb[0] == b'\x00'(Python 2)の代わりにb[0:1] == b'\x00'と書いてください。他のオプションは、bytearray(バイトが変更可能な場合)またはヘルパー関数を使用しています。

Python 2では、文字列はunicodeで、Python 3の移植とは独立しています。そうでなければ、ASCII以外の文字に遭遇するとコードが間違っている可能性があります。等価はPython 3でstrです。
uリテラルを使用して文字列(u'Düsseldorf'など)を作成したり、すべてのファイルをfrom __future__ import unicode_literalsで開始するようにしてください。必要に応じて、ファイルを開始して# encoding: utf-8でファイルエンコードを宣言します。
io.openを使用すると、ファイルから文字列を読み取ることができます。ネットワークコードの場合は、バイトを取り出してdecodeを呼び出して文字列を取得します。

Python 2.5または3をサポートする必要がある場合。2、リテラルを変換するにはsixを見てください。

アサーションをたくさん追加して、文字列を操作する関数がバイトを取得しないようにしたり、逆もまた同様です。いつものように、100%カバレッジの良いテストスイートは大いに役立ちます。

関連する問題