web-dev-qa-db-ja.com

Python 2 unicode()関数を正しいPython 3.x構文に変換する方法

Python IDEで互換性チェックを有効にしましたが、継承されたPython 2.7コードには多くのPython 3.xでは許可されないunicode()の呼び出し。

私はPython2の docs を調べましたが、アップグレードのヒントは見つかりませんでした。

今はPython3に切り替えたくありませんが、おそらく将来的には。

コードにはunicode()への約500の呼び出しが含まれています

どうやって進める?

更新

pyporting ガイドを読むユーザーvaultahのコメントは、いくつかの賛成票を受け取っています。

私の現在の解決策はこれです(ピーター・ブリテンに感謝します):

from builtins import str

... pyporting docs ...でこのヒントを見つけることができませんでした。

12
guettli

コメントですでに指摘したように、すでに 2から3への移植に関するアドバイス があります。

最近、自分のコードの一部を2から3に移植し、それぞれの互換性を維持する必要があったため、コードの更新に役立つ優れたツールを提供する python-future を使用することを強くお勧めします(futurize)および 相互互換コードの記述方法 の明確なガイダンス。

あなたの特定のケースでは、すべての呼び出しをユニコードに変換してstrを使用し、次に 組み込みのstrをインポート を使用します。すべてのIDE最近の価値があるものは、そのグローバル検索を実行し、1つの操作で置換します。

もちろん、自動変換を使用するだけの場合(およびコード内の他の潜在的な問題を検索する場合)、これはfuturizeがキャッチする必要のある種類のことでもあります。

21
Peter Brittain

実行しているPythonのバージョンにunicode()などの関数があるかどうかをテストできます。そうでない場合は、unicode()関数のstr()エイリアスを作成できます。これは、Python 3でunicode()がPython 2で行ったことを次のように行います。 Python 3では、すべての文字列はユニコードです。

# Python 3 compatibility hack
try:
    unicode('')
except NameError:
    unicode = str

より完全な移植がおそらくより良いアイデアであることに注意してください。詳細は 移植ガイド を参照してください。

8
Quint

短い答え:すべてのunicode呼び出しをstr呼び出しに置き換えます。

長い答え:Python 3では、Unicodeは豊富なため文字列に置き換えられました。Python 3のみを使用している場合は、次の解決策が機能するはずです。

unicode = str
# the rest of your goes goes here

Python 2またはPython 3の両方で使用している場合は、代わりにこれを使用してください。

import sys
if sys.version_info.major == 3:
    unicode = str
# the rest of your code goes here

逆の方法:コマンドラインでこれを実行します

$ 2to3 package -w
5
user4913676

まず、戦略として、私はあなたのプログラムのごく一部を取り上げ、それを移植しようとします。あなたが説明しているunicode呼び出しの数は、あなたのアプリケーションが文字列表現を大部分より重視していて、それぞれのユースケースがしばしば異なることを示唆しています。

重要な考慮事項はすべての文字列はPythonのユニコードです。strタイプを使用して「バイト」を格納している場合(たとえば、それらがファイルから読み取られる場合)、それらはPython3ではバイトではなく、そもそもUnicode文字になることに注意してください。

いくつかのケースを見てみましょう。

まず、ASCII以外の文字がまったくなく、実際にUnicode文字セットを使用していない場合は、簡単です。おそらく、unicode()関数をstr()に変更するだけです。これにより、引数として渡されたオブジェクトが適切に変換されます。しかし、それはそれが簡単であると想定することは希望的観測です。

ほとんどの場合、unicode()の引数を調べて、それが何であるかを確認し、その処理方法を決定する必要があります。

たとえば、Python 2のファイルからUTF-8文字を読み取り、それらをUnicodeに変換する場合、コードは次のようになります。

_data = open('somefile', 'r').read()
udata = unicode(data)
_

ただし、Python3では、read()は最初からUnicodeデータを返すため、ファイルを開くときにUnicodeデコードを指定する必要があります。

_udata = open('somefile', 'r', encoding='UTF-8').read()
_

ご覧のとおり、移植時のunicode()の変換は、アプリケーションがUnicode変換を実行する方法と理由、データの取得元、送信先に大きく依存します。

Python3は文字列表現をより明確にします。これは歓迎されますが、移植を困難なものにする可能性があります。たとえば、Python3には適切なbytesタイプがあり、バイトデータを次のようにUnicodeに変換します。

_udata = bytedata.decode('UTF-8')
_

または、逆の変換を使用してUnicodeデータを文字形式に変換します。

_bytedata = udata.encode('UTF-8')
_

これが少なくとも戦略の決定に役立つことを願っています。

4
Gary Wisniewski