NameError: глобальное имя 'unicode' не определено - в Python 3

136

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

TJ1
источник

Ответы:

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инструмент, чтобы увидеть, как он переводит код для вас.

Мартейн Питерс
источник
Итак, я должен написать: if isinstance (unicode_or_str, str)? Как насчет "unicode_or_str"?
TJ1
1
Имя переменной здесь не имеет большого значения; if isinstance(unicode_or_str, str)должно просто работать. Переименование имени переменной необязательно.
Мартейн Питерс
5
@ TJ1: Убедитесь, что вы не удалили закрывающую скобку или что-то еще. Код должен работать нормально, просто unicode заменив его на str.
Мартейн Питерс
Вы правы, Martijn, я забыл включить: в моем коде, спасибо за помощь, теперь работает.
TJ1 09
Мне нравится инструмент 2to3
ji-
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

Вы можете использовать библиотеку six для поддержки Python 2 и 3:

import six
if isinstance(value, six.string_types):
    handle_string(value)
Банкомат
источник
1

Надеюсь, вы используете Python 3, Str по умолчанию является юникодом, поэтому замените Unicodeфункцию на функцию String Str.

if isinstance(unicode_or_str, str):    ##Replaces with str
    text = unicode_or_str
    decoded = False
MJ
источник
2
это не сохраняет BC, как ответ от @atm. Пожалуйста, подумайте об отзыве или обновлении своего ответа. Нет причин оставлять пользователей python2 позади или ломать python3
MrMesees