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.

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.


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)

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)

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.