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

Я пытаюсь использовать пакет 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, сообщите мне, обнаружили ли они похожие проблемы или нет. Я ценю вашу помощь.


person TJ1    schedule 09.11.2013    source источник


Ответы (5)


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

person Martijn Pieters    schedule 09.11.2013
comment
Так что я должен написать: if isinstance (unicode_or_str, str)? Как насчет "unicode_or_str"? - person TJ1; 09.11.2013
comment
Имя переменной здесь не имеет большого значения; if isinstance(unicode_or_str, str) должно просто работать. Переименование имени переменной необязательно. - person Martijn Pieters; 09.11.2013
comment
@ TJ1: Убедитесь, что вы не удалили закрывающую скобку или что-то еще. Код должен работать нормально с заменой просто unicode на str. - person Martijn Pieters; 09.11.2013
comment
Вы правы, Martijn, я забыл включить: в моем коде, спасибо за помощь, теперь работает. - person TJ1; 09.11.2013
comment
Мне нравится инструмент 2to3 - person ji-ruh; 25.10.2017

Если вам нужно, чтобы скрипт продолжал работать на python2 и 3, как я, это может помочь кому-то

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

а затем можно просто сделать, например,

foo = unicode.lower(foo)
person Neil McGill    schedule 13.11.2018
comment
Это правильная идея, хороший ответ. Просто чтобы добавить детали, если вы используете библиотеку six для управления совместимостью Python 2/3, вы можете сделать это: if six.PY3: unicode = str вместо sys.version_info. Это также очень полезно для предотвращения ошибок линтера, связанных с неопределенностью юникода в Python 3, без необходимости специальных исключений из правил линтера. - person ely; 06.09.2019

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

import six
if isinstance(value, six.string_types):
    handle_string(value)
person atm    schedule 12.07.2017

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

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

Можно заменить unicode на u''.__class__, чтобы обработать отсутствующий класс unicode в Python 3. И для Python 2, и для Python 3 вы можете использовать конструкцию

isinstance(unicode_or_str, u''.__class__)

or

type(unicode_or_str) == type(u'')

В зависимости от вашей дальнейшей обработки рассмотрите другой результат:

Python 3

>>> isinstance('text', u''.__class__)
True
>>> isinstance(u'text', u''.__class__)
True

Python 2

>>> isinstance(u'text', u''.__class__)
True
>>> isinstance('text', u''.__class__)
False
person Friedrich    schedule 25.11.2020