NameError:グローバル名 'unicode'が定義されていません-Python 3


136

BidiというPythonパッケージを使用しようとしています。このパッケージのモジュール(algorithm.py)には、パッケージの一部ですが、エラーが発生する行がいくつかあります。

ここに行があります:

# utf-8 ? we need unicode
if isinstance(unicode_or_str, unicode):
    text = unicode_or_str
    decoded = False
else:
    text = unicode_or_str.decode(encoding)
    decoded = True

そしてここにエラーメッセージがあります:

Traceback (most recent call last):
  File "<pyshell#25>", line 1, in <module>
    bidi_text = get_display(reshaped_text)
  File "C:\Python33\lib\site-packages\python_bidi-0.3.4-py3.3.egg\bidi\algorithm.py",   line 602, in get_display
    if isinstance(unicode_or_str, unicode):
NameError: global name 'unicode' is not defined

Python3で機能するように、コードのこの部分をどのように書き直す必要がありますか?また、Python 3でBidiパッケージを使用したことがある場合は、同様の問題を発見したかどうかをお知らせください。私はあなたの助けに感謝します。

回答:


214

Python 3はunicodeタイプの名前をに変更しました。str古いstrタイプはに置き換えられましたbytes

if isinstance(unicode_or_str, str):
    text = unicode_or_str
    decoded = False
else:
    text = unicode_or_str.decode(encoding)
    decoded = True

このような詳細については、Python 3移植HOWTOをご覧ください。Lennart RegebroによるPython 3へ移植:オンラインで無料の詳細ガイドもあります。

最後に重要なことですが、2to3ツールを使用してコードがどのように変換されるかを確認することもできます。


だから私は書くべきです:if isinstance(unicode_or_str、str)?「unicode_or_str」はどうですか?
TJ1 2013年

1
変数名はここではあまり重要ではありません。if isinstance(unicode_or_str, str)うまくいくはずです。変数名の変更はオプションです。
Martijn Pieters

5
@ TJ1:閉じ括弧などを削除していないことを確認してください。コードは、 unicode置き換えただけで問題なく機能するはずstrです。
Martijn Pieters

あなたは正しいMartijn、私は含めることを忘れていました:私のコードに、助けてくれてありがとう、それは今動作します。
TJ1 2013年

2to3ツールが好き
ji-ruh

22

スクリプトを私と同じようにpython2と3で動作させ続ける必要がある場合、これは誰かを助けるかもしれません

import sys
if sys.version_info[0] >= 3:
    unicode = str

そして、例えばちょうどすることができます

foo = unicode.lower(foo)

1
これは正しい考えです。良い答えです。あなたが使用している場合だけで、詳細を追加するsixPythonの2/3の互換性を管理するためのライブラリを、あなたはこれを行うことができます。if six.PY3: unicode = str代わりにsys.version_infoもの。これは、特別なリンタールールの免除を必要とせずに、Python 3で未定義のユニコードに関連するリンターエラーを防ぐのにも非常に役立ちます。
エリー

20

6ライブラリを使用して、Python 2と3の両方をサポートできます。

import six
if isinstance(value, six.string_types):
    handle_string(value)

1

Python 3を使用しているとよいのですが、StrはデフォルトでUnicodeであるため、Unicode関数を文字列Str関数に置き換えてください。

if isinstance(unicode_or_str, str):    ##Replaces with str
    text = unicode_or_str
    decoded = False

2
@atmからの回答のようにBCが保持されません。回答を撤回または更新することを検討してください。python2ユーザーを残したり、python3を壊したりする理由はありません
MrMesees
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.