web-dev-qa-db-fra.com

NameError: le nom global 'unicode' n'est pas défini - dans Python 3

J'essaie d'utiliser un package Python appelé bidi. Dans un module de ce paquetage (algorithm.py), certaines lignes me donnent une erreur, bien que cela fasse partie du paquetage.

Voici les lignes:

# 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

et voici le message d'erreur:

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

Comment dois-je réécrire cette partie du code pour qu'elle fonctionne en Python3? Aussi, si quelqu'un a utilisé le paquet bidi avec Python 3, veuillez me faire savoir s'il a détecté des problèmes similaires ou non. J'apprécie ton aide.

104
TJ1

Python 3 a renommé le type unicode en str, l'ancien type str a été remplacé par bytes.

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

Vous voudrez peut-être lire le HOWTO de portage de Python 3 pour plus de détails. Il existe également le portage de Lennart Regebro sur Python 3: un guide détaillé , gratuit en ligne.

Enfin et surtout, vous pouvez simplement essayer d'utiliser l'outil 2to3 pour voir comment cela traduit le code pour vous.

177
Martijn Pieters

Vous pouvez utiliser la bibliothèque six pour prendre en charge à la fois Python 2 et 3:

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

Si vous avez besoin que le script continue à travailler sur python2 et 3 comme je le faisais, cela pourrait aider quelqu'un

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

et peut alors juste faire par exemple

foo = unicode.lower(foo)
9
Neil McGill

J'espère que vous utilisez Python 3, Str sont unicode par défaut, veuillez donc remplacer la fonction Unicode par la fonction String Str.

if isinstance(unicode_or_str, str):    ##Replaces with str
    text = unicode_or_str
    decoded = False
1
M.J