NameError: глобальне ім'я 'unicode' не визначено - в Python 3


136

Я намагаюся використовувати пакет Python під назвою bidi. У модулі цього пакета (algormm.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? Також якщо хтось використовував пакет bidi з Python 3, будь ласка, повідомте мені, чи виявили вони подібні проблеми чи ні. Я вдячний за твою допомогу.

Відповіді:


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

Ви можете прочитати HOWTO, що передає портал Python 3, щоб отримати більше таких деталей. Існує також перенесення Леннарта Регебро на Python 3: Поглиблений посібник , безкоштовний онлайн.

І останнє, але не менш важливе, ви можете просто спробувати скористатися 2to3інструментом, щоб побачити, як це переводить код для вас.


Тож я повинен написати: якщо isin substance (unicode_or_str, str)? Як щодо 'unicode_or_str'?
TJ1

1
Ім'я змінної тут не має великого значення; if isinstance(unicode_or_str, str)повинен просто працювати. Перейменування назви змінної не є обов'язковим.
Martijn Pieters

5
@ TJ1: Переконайтеся, що ви не видалили дужки, що закриваються, чи щось десь. Код повинен працювати добре, тільки що unicode замінений на str.
Martijn Pieters

ви праві, Мартійн, я забув включити: у своєму коді, дякую за допомогу, він працює і зараз.
TJ1

Мені подобається інструмент 2to3
ji-ruh

22

Якщо вам потрібно, щоб сценарій продовжував працювати на python2 та 3, як я, це може комусь допомогти

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

а потім можна робити, наприклад

foo = unicode.lower(foo)

1
Це правильна ідея, приємна відповідь. Просто для додання деталей, якщо ви використовуєте sixбібліотеку для управління сумісністю Python 2/3, ви можете зробити це: if six.PY3: unicode = strзамість sys.version_infoречей. Це також дуже корисно для запобігання невизначеності помилок лінійки, пов’язаних з тим, що Unicode не визначений в Python 3, без необхідності спеціальних винятків правил лінійки.
ely

20

Ви можете використовувати шість бібліотек для підтримки і Python 2, і 3:

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

1

Сподіваємось, ви використовуєте Python 3, Str за замовчуванням unicode, тому будь ласка замініть Unicodeфункцію на функцію String Str.

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

2
що не зберігає BC, як відповідь від @atm. Будь ласка, подумайте про відкликання або оновлення своєї відповіді. Немає причин залишати користувачів python2 позаду або зламати python3
MrMesees
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.