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.

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.


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)

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)

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.