2016-08-01 22 views
-4
konvertieren

Ich habe die Kompatibilitätsprüfung in meiner Python-IDE aktiviert und jetzt merke ich, dass der geerbte Python 2.7-Code viele Aufrufe an unicode(), die nicht erlaubt sind Python 3.x.wie Python 2 Unicode() -Funktion in korrekte Python 3.x Syntax

schaute ich auf die docs von Python2 und keinen Hinweis gefunden, wie ein Upgrade:

ich jetzt Python3 wechseln möchten nicht, aber vielleicht in der Zukunft.

Der Code enthält etwa 500 Anrufe unicode()

Wie gehe ich vor?

aktualisieren

Der Kommentar von Benutzer vaultah die pyporting Handbuch lesen mehrere upvotes erhalten hat.

Meine aktuelle Lösung ist der Lauf (dank Peter Brittain):

from builtins import str 

... Ich kann nicht diesen Hinweis in der pyporting docs finden .....

+5

https://docs.python.org/3/howto/pyporting.html – vaultah

+0

@vaultah dies ist nicht eine allgemeine Frage. Es geht nur um 'unicode()' Aufrufe. Ich bin die Codebasis, an der ich gerade arbeite, es gibt ca. 700 Aufrufe zu dieser Methode. Was soll ich machen? – guettli

+2

Es gibt keine gute Antwort auf diese Frage. Wenn Sie Glück haben, können Sie einfach die Anrufe zu "Unicode" entfernen und Sie sind gut zu gehen. Alle Strings sind Unicode in Python 3. Wenn das nicht funktioniert, dann erwarte * viele * Arbeit. Der Übergang von Str zu Unicode Literalen und Bytes ist bei weitem die inkompatibelste Änderung, wenn man von Python 2 auf 3 umschaltet. – Phillip

Antwort

12

Wie bereits in den Kommentaren erwähnt, gibt es bereits advice on porting from 2 to 3.

Nachdem ich vor kurzem einige meiner eigenen Code von 2 bis 3 portieren musste und die Kompatibilität für jeden jetzt beibehalten, empfehle ich von ganzem Herzen die Verwendung python-future, die ein großartiges Tool zur Aktualisierung Ihres Codes (futurize) sowie klare Leitlinien bietet für how to write cross-compatible code.

In Ihrem speziellen Fall würde ich einfach alle Anrufe in Unicode konvertieren, um str und dann import str from builtins zu verwenden. Jede IDE, die heute ihren Wert hat, wird das globale Suchen und Ersetzen in einem Arbeitsgang erledigen.

Natürlich sollte Futurize auch so aussehen, wenn Sie nur die automatische Konvertierung verwenden möchten (und nach anderen möglichen Problemen in Ihrem Code suchen).

+1

Ja, 'futurize' wird helfen, die Codebasis zu transformieren; 'unicode()' Aufrufe werden zu 'str()' Aufrufen mit einem 'from builtins import str' importiert. Berücksichtigen Sie, dass in der Regel eine Installationstyp-Anforderung für die Bibliothek 'future' in Python 2 hinzugefügt wird (um das Modul backported' builtins' bereitzustellen). –

+0

Dies wird unter anderen Bibliotheken sqlalchemy brechen. –

1

Sie können es testen, ob ist eine solche Funktion wie unicode() in der Version von Python, die Sie ausführen. Wenn nicht, können Sie einen unicode() Alias ​​für die str() Funktion erstellen, die in Python tut 3, was unicode() in Python hat 2, da alle Strings Unicode sind in Python 3.

# Python 3 compatibility hack 
try: 
    unicode('') 
except NameError: 
    unicode = str 

Beachten Sie, dass eine vollständigere Port ist wahrscheinlich eine bessere Idee; Details siehe the porting guide.

+0

Ja, diese handgemachte Lösung sollte funktionieren. Aber ich schätze, ich werde die zukünftige Bibliothek benutzen, wie in der Antwort von Peter Brittain erklärt. – guettli

4

Erstens, als eine Strategie, würde ich einen kleinen Teil Ihres Programms nehmen und versuchen, es zu portieren. Die Anzahl der unicode Aufrufe, die Sie beschreiben, legt nahe, dass Ihre Anwendung mehr Wert auf String-Darstellungen legt als die meisten anderen, und jeder Anwendungsfall ist oft anders.

Die wichtige Überlegung ist, dass alle Zeichenfolgen Unicode in Python 3 sind. Wenn Sie den Typ str zum Speichern von "Bytes" verwenden (z. B. wenn sie aus einer Datei gelesen werden), sollten Sie beachten, dass diese in Python3 keine Bytes sind, sondern zunächst Unicode-Zeichen sind.

Schauen wir uns ein paar Fälle an.

Erstens, wenn Sie überhaupt keine Nicht-ASCII-Zeichen haben und den Unicode-Zeichensatz wirklich nicht verwenden, ist es einfach. Wahrscheinlich können Sie einfach die unicode() Funktion zu str() ändern. Dadurch wird sichergestellt, dass jedes Objekt, das als Argument übergeben wird, ordnungsgemäß konvertiert wird. Es ist jedoch Wunschdenken anzunehmen, dass es so einfach ist.

Am wahrscheinlichsten müssen Sie das Argument zu unicode() betrachten, um zu sehen, was es ist, und bestimmen, wie man es behandelt.

Zum Beispiel, wenn Sie UTF-8-Zeichen aus einer Datei in Python lesen 2 und deren Umwandlung Code in Unicode würden wie folgt aussehen:

data = open('somefile', 'r').read() 
udata = unicode(data) 

jedoch in Python3, read() gibt Unicode-Daten zunächst einmal, und die Unicode-Dekodierung muss angegeben werden, beim Öffnen der Datei:

udata = open('somefile', 'r', encoding='UTF-8').read() 

wie Sie sehen können, unicode() einfach transformieren, wenn die Portierung abhängen kann sich stark auf, wie und warum die Anwendung Unicode convers tut Ionen, woher die Daten stammen und wohin sie gehen.

Python3 bringt mehr Klarheit in String-Repräsentationen, was zwar willkommen ist, aber Porting entmutigend machen kann. Zum Beispiel hat Python3 einen richtigen bytes Typen, und Sie konvertieren Byte-Daten wie folgt Unicode:

udata = bytedata.decode('UTF-8') 

oder Unicode-Daten in Zeichenform umwandeln das Gegenteil verwandeln werden.

bytedata = udata.encode('UTF-8') 

Ich hoffe, dass dies zumindest hilft, eine Strategie zu bestimmen.

+0

Große Antwort, die die Bedeutung von "unicode()" richtig zu ersetzen erklärt –

1

Kurze Antwort: Ersetzen Sie alle unicode Anrufe mit str Anrufe.

Lange Antwort: In Python 3 wurde Unicode wegen seiner Häufigkeit durch Zeichenfolgen ersetzt. Die folgende Lösung sollte funktionieren, wenn Sie Python verwenden 3:

unicode = str 
# the rest of your goes goes here 

Wenn Sie es verwenden sowohl mit Python 2 oder Python 3, diese stattdessen verwenden:

import sys 
if sys.version_info.major == 3: 
    unicode = str 
# the rest of your code goes here 

Die andere Art und Weise: laufen diese in der Befehlszeile

$ 2to3 package -w