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.

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.


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)

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)

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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.