NameError: Der globale Name 'Unicode' ist nicht definiert - in Python 3

136

Ich versuche ein Python-Paket namens bidi zu verwenden. In einem Modul in diesem Paket (algorithm.py) gibt es einige Zeilen, die mir Fehler geben, obwohl es Teil des Pakets ist.

Hier sind die Zeilen:

# 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

und hier ist die Fehlermeldung:

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

Wie soll ich diesen Teil des Codes neu schreiben, damit er in Python3 funktioniert? Auch wenn jemand ein Bidi-Paket mit Python 3 verwendet hat, lassen Sie mich bitte wissen, ob er ähnliche Probleme gefunden hat oder nicht. Ich schätze Ihre Hilfe.

TJ1
quelle

Antworten:

213

Python 3 hat den unicodeTyp in umbenannt str, der alte strTyp wurde durch ersetzt bytes.

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

Weitere Informationen finden Sie im Python 3-Portierungs-HOWTO . Es gibt auch Lennart Regebros Portierung auf Python 3: Eine ausführliche Anleitung , die kostenlos online ist.

Zu guter Letzt können Sie einfach versuchen, mit dem 2to3Tool zu sehen, wie der Code für Sie übersetzt wird.

Martijn Pieters
quelle
Soll ich also schreiben: if isinstance (unicode_or_str, str)? Wie wäre es mit 'unicode_or_str'?
TJ1
1
Der Variablenname spielt hier keine große Rolle. if isinstance(unicode_or_str, str)sollte einfach funktionieren. Das Umbenennen des Variablennamens ist optional.
Martijn Pieters
5
@ TJ1: Stellen Sie sicher, dass Sie keine schließende Klammer oder etwas entfernt haben. Der Code sollte gut funktionieren mit nur unicode mit ersetzt str.
Martijn Pieters
du hast recht Martijn, ich habe vergessen aufzunehmen: in meinen Code, danke für die Hilfe, es funktioniert jetzt.
TJ1
Ich mag 2to3 Tool
ji-ruh
22

Wenn das Skript weiterhin wie ich an Python2 und 3 funktioniert, kann dies jemandem helfen

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

und kann dann einfach zum Beispiel tun

foo = unicode.lower(foo)
Neil McGill
quelle
1
Das ist die richtige Idee, schöne Antwort. sixUm ein Detail hinzuzufügen: Wenn Sie die Bibliothek zum Verwalten der Python 2/3-Kompatibilität verwenden, können Sie Folgendes tun: if six.PY3: unicode = stranstelle von sys.version_infoDingen. Dies ist auch sehr hilfreich, um zu verhindern, dass Linterfehler im Zusammenhang mit Unicode in Python 3 undefiniert werden, ohne dass spezielle Ausnahmen für Linterregeln erforderlich sind.
ely
20

Sie können die sechs Bibliotheken verwenden, um sowohl Python 2 als auch 3 zu unterstützen:

import six
if isinstance(value, six.string_types):
    handle_string(value)
Geldautomat
quelle
1

Ich hoffe, Sie verwenden Python 3, Str sind standardmäßig Unicode. Ersetzen Sie daher die UnicodeFunktion durch die String- StrFunktion.

if isinstance(unicode_or_str, str):    ##Replaces with str
    text = unicode_or_str
    decoded = False
MJ
quelle
2
Das bewahrt BC nicht wie die Antwort von @atm. Bitte ziehen Sie in Betracht, Ihre Antwort zurückzuziehen oder zu aktualisieren. Es gibt keinen Grund, Python2-Benutzer zurückzulassen oder Python3 zu brechen
MrMesees