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

136

J'essaye d'utiliser un package Python appelé bidi. Dans un module de ce package (algorithm.py), il y a des lignes qui me donnent une erreur, bien que cela fasse partie du package.

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 réécrire cette partie du code pour qu'elle fonctionne en Python3? Aussi, si quelqu'un a utilisé le package bidi avec Python 3, veuillez me faire savoir s'il a rencontré des problèmes similaires ou non. J'apprécie ton aide.

TJ1
la source

Réponses:

214

Python 3 a renommé le unicodetype en str, l'ancien strtype 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 sur le portage de Python 3 pour plus de détails. Il existe également le portage vers Python 3 de Lennart Regebro : un guide détaillé , gratuit en ligne.

Dernier point mais non le moindre, vous pouvez simplement essayer d'utiliser l' 2to3outil pour voir comment cela traduit le code pour vous.

Martijn Pieters
la source
Alors devrais-je écrire: if isinstance (unicode_or_str, str)? Et "unicode_or_str"?
TJ1
1
Le nom de la variable n'a pas beaucoup d'importance ici; if isinstance(unicode_or_str, str)devrait juste fonctionner. Renommer le nom de la variable est facultatif.
Martijn Pieters
5
@ TJ1: Assurez-vous que vous n'avez pas supprimé une parenthèse fermante ou quelque chose quelque part. Le code devrait fonctionner correctement avec juste unicode remplacé par str.
Martijn Pieters
tu as raison Martijn, j'ai oublié d'inclure: dans mon code, merci pour l'aide, ça marche maintenant.
TJ1
J'aime l'outil 2to3
ji-ruh
22

Si vous avez besoin que le script continue à travailler sur python2 et 3 comme je l'ai fait, 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)
Neil McGill
la source
1
C'est la bonne idée, belle réponse. Juste pour ajouter un détail, si vous utilisez la sixbibliothèque pour gérer la compatibilité Python 2/3, vous pouvez faire ceci: if six.PY3: unicode = strau lieu de sys.version_infochoses. Ceci est également très utile pour empêcher les erreurs de linter liées à l'unicode d'être indéfinies dans Python 3, sans avoir besoin d'exemptions spéciales de règle de linter.
ely
20

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

import six
if isinstance(value, six.string_types):
    handle_string(value)
au m
la source
1

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

if isinstance(unicode_or_str, str):    ##Replaces with str
    text = unicode_or_str
    decoded = False
MJ
la source
2
qui ne préserve pas la Colombie-Britannique comme la réponse de @atm Veuillez envisager de retirer ou de mettre à jour votre réponse. Il n'y a aucune raison de laisser les utilisateurs de python2 derrière ou de casser python3
MrMesees