NameError: el nombre global 'unicode' no está definido - en Python 3

136

Estoy tratando de usar un paquete de Python llamado bidi. En un módulo de este paquete (Algoritmo.py) hay algunas líneas que me dan error, aunque es parte del paquete.

Aquí están las líneas:

# 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

y aquí está el mensaje de error:

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

¿Cómo debería volver a escribir esta parte del código para que funcione en Python3? Además, si alguien ha usado el paquete bidi con Python 3, avíseme si ha encontrado problemas similares o no. Aprecio tu ayuda.

TJ1
fuente

Respuestas:

214

Python 3 renombró el unicodetipo a str, el strtipo antiguo ha sido reemplazado por bytes.

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

Es posible que desee leer el COMO de portado de Python 3 para obtener más detalles. También está Porting to Python 3 de Lennart Regebro : una guía detallada , gratuita en línea.

Por último, pero no menos importante, puedes intentar usar la 2to3herramienta para ver cómo eso traduce el código por ti.

Martijn Pieters
fuente
Entonces, ¿debería escribir: if isinstance (unicode_or_str, str)? ¿Qué tal 'unicode_or_str'?
TJ1
1
El nombre de la variable no importa mucho aquí; if isinstance(unicode_or_str, str)debería funcionar Cambiar el nombre de la variable es opcional.
Martijn Pieters
55
@ TJ1: asegúrese de no eliminar un paréntesis de cierre o algo en alguna parte. El código debería funcionar bien con solo unicode reemplazado por str.
Martijn Pieters
tienes razón Martijn, olvidé incluir: en mi código, gracias por la ayuda, funciona ahora.
TJ1
Me gusta la herramienta 2to3
ji-ruh
22

Si necesita que el script siga funcionando en python2 y 3 como lo hice, esto podría ayudar a alguien

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

y luego puede hacer por ejemplo

foo = unicode.lower(foo)
Neil McGill
fuente
1
Esta es la idea correcta, buena respuesta. Solo para agregar un detalle, si está utilizando la sixbiblioteca para administrar la compatibilidad con Python 2/3, puede hacer esto: en if six.PY3: unicode = strlugar de sys.version_infocosas. Esto también es muy útil para evitar que los errores de linter relacionados con Unicode no estén definidos en Python 3, sin necesidad de exenciones especiales de reglas de linter.
ely
20

Puede usar las seis bibliotecas para admitir Python 2 y 3:

import six
if isinstance(value, six.string_types):
    handle_string(value)
Cajero automático
fuente
1

Espero que estés usando Python 3, Str son unicode por defecto, así que reemplaza la Unicodefunción con la Strfunción String .

if isinstance(unicode_or_str, str):    ##Replaces with str
    text = unicode_or_str
    decoded = False
MJ
fuente
2
que no conserva BC como la respuesta de @atm Considere retractarse o actualizar su respuesta. No hay ninguna razón para dejar atrás a los usuarios de python2 o romper Python3
MrMesees el