web-dev-qa-db-ja.com

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

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パッケージを使用したことがある場合は、同様の問題が見つかったかどうかを教えてください。私はあなたの助けに感謝します。

98
TJ1

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 porting HOWTO をお読みください。 Lennart Regebroの Porting to Python 3:An in-depth guide もあり、無料のオンラインです。

最後になりましたが、 2to3 tool を使用して、コードがどのように変換されるかを確認してみてください。

170
Martijn Pieters

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

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

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

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

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

foo = unicode.lower(foo)
8
Neil McGill

Python 3を使用していることを願っています。StrはデフォルトでUnicodeです。したがって、Unicode関数をString Str関数に置き換えてください。

if isinstance(unicode_or_str, str):    ##Replaces with str
    text = unicode_or_str
    decoded = False
1
M.J