So portieren Sie Python 2-Code auf Python 3

Einführung

Python wurde Ende der 1980er Jahre entwickelt und erstmals 1991 veröffentlicht. Mit einem Namen, der von der britischen Comedy-Gruppe Monty Python inspiriert wurde, wurde Python als Nachfolger der zwingenden Allzweck-ABC-Programmiersprache konzipiert. In seiner ersten Iteration enthielt Python bereits die Ausnahmebehandlung functions und https: //www.digitalocean .com / community / tutorials / verständnis-vererbung-in-python-3 [klassen mit vererbung].

In diesem Lernprogramm erfahren Sie, welche bewährten Methoden und Überlegungen bei der Migration von Code von Python 2 nach Python 3 zu beachten sind und ob Sie Code beibehalten sollten, der mit beiden Versionen kompatibel ist.

Hintergrund

  • Python 2 * wurde im Jahr 2000 veröffentlicht und signalisiert einen transparenteren und umfassenderen Sprachentwicklungsprozess. Es enthielt viele weitere programmatische Funktionen und fügte während seiner Entwicklung weitere Funktionen hinzu.

  • Python 3 * gilt als die Zukunft von Python und ist die Version der Sprache, die derzeit in der Entwicklung ist. Python 3 wurde Ende 2008 veröffentlicht und behebt und korrigiert inhärente Designfehler. Die Übernahme von Python 3 war jedoch langsam, da die Sprache nicht abwärtskompatibel mit Python 2 ist.

  • Python 2.7 * wurde 2010 als letzte der 2.x-Versionen veröffentlicht. Die Absicht von Python 2.7 bestand darin, Python 2.x-Benutzern das Portieren von Funktionen auf Python 3 zu erleichtern, indem ein gewisses Maß an Kompatibilität zwischen beiden bereitgestellt wurde.

Weitere Informationen zu Python-Versionen und zur Auswahl der zu verwendenden Versionen finden Sie in unserem Lernprogramm „https://www.digitalocean.com/community/tutorials/python-2-vs-python-3-practical-considerations-2[Python 2 vs Python 3: Praktische Überlegungen

Beginnen Sie mit Python 2.7

Um zu Python 3 zu wechseln oder Python 2 und Python 3 gleichzeitig zu unterstützen, müssen Sie sicherstellen, dass Ihr Python 2-Code vollständig Python 2.7-kompatibel ist.

Viele Entwickler haben bereits ausschließlich mit Python 2.7-Code gearbeitet, aber es ist wichtig zu bestätigen, dass alles, was nur von früheren Versionen unterstützt wird, ordnungsgemäß mit Python 2.7 funktioniert und mit dem Python 2.7-Stil übereinstimmt.

Es ist besonders wichtig sicherzustellen, dass Ihr Code in Python 2.7 enthalten ist, da dies die einzige Version von Python 2 ist, die noch gewartet wird und Fehlerbehebungen erhält. Wenn Sie an einer früheren Version von Python 2 arbeiten, müssen Sie Probleme umgehen, die bei Code auftreten, der nicht mehr unterstützt wird und keine Buxfixes mehr empfängt.

Darüber hinaus werden einige Tools, die das Portieren von Code erleichtern, wie das Paket Pylint, das nach Programmierfehlern sucht, von früheren Python-Versionen nicht unterstützt als 2.7.

Es ist wichtig zu bedenken, dass Python 2.7, obwohl es derzeit noch unterstützt und gewartet wird, irgendwann das Ende seiner Lebensdauer erreichen wird. PEP 373 beschreibt den Zeitplan für die Veröffentlichung von Python 2.7 und markiert zum Zeitpunkt des Schreibens das Ablaufdatum als 2020.

Testabdeckung

Das Erstellen von Testfällen kann ein wichtiger Teil der Migrationsarbeit von Python 2 zu Python 3-Code sein. Wenn Sie mehr als eine Version von Python verwalten, sollten Sie auch sicherstellen, dass Ihre Testsuite insgesamt eine gute Abdeckung aufweist, um sicherzustellen, dass jede Version weiterhin wie erwartet funktioniert.

Im Rahmen Ihrer Tests können Sie den Dokumentfolgen all Ihrer Funktionen, Methoden, Klassen und Module interaktive Python-Fälle hinzufügen und dann die integrierte https://docs.python.org/3.6/library/doctest verwenden. html [+ doctest + module], um zu überprüfen, ob sie wie gezeigt funktionieren.

Neben + doctest + können Sie das Paket https://pypi.python.org/pypi/coverage [+ coverage.py +] verwenden, um die Abdeckung von Einheitentests zu verfolgen. Dieses Tool überwacht Ihr Programm und merkt sich, welche Teile des Codes ausgeführt wurden und welche Teile hätten ausgeführt werden können, dies aber nicht waren. + coverage.py + kann Berichte über die Befehlszeile ausdrucken oder HTML-Ausgaben bereitstellen. Es wird in der Regel verwendet, um die Wirksamkeit von Tests zu messen. Dabei wird angezeigt, welche Teile des Codes von Tests ausgeübt werden und welche nicht.

Denken Sie daran, dass Sie keine 100% ige Testabdeckung anstreben - Sie möchten sicherstellen, dass Sie verwirrenden oder ungewöhnlichen Code abdecken. Für Best Practices sollten Sie eine Abdeckung von 80% anstreben.

Erfahren Sie mehr über die Unterschiede zwischen Python 2 und Python 3

Wenn Sie sich mit den Unterschieden zwischen Python 2 und Python 3 vertraut machen, können Sie die neuen Funktionen nutzen, die in Python 3 verfügbar sind oder verfügbar sein werden.

Unser Leitfaden zu "https://www.digitalocean.com/community/tutorials/python-2-vs-python-3-practical-considerations-2[Python 2 vs Python 3]" geht auf einige der folgenden https: // www.digitalocean.com/community/tutorials/python-2-vs-python-3-practical-considerations-2#key-differences[key difference] zwischen den beiden Versionen, und Sie können https: //docs.python überprüfen .org / 3 / [offizielle Python-Dokumentation] für weitere Einzelheiten.

Wenn Sie mit der Portierung und Migration beginnen, können Sie verschiedene Syntaxänderungen jetzt implementieren.

+ print +

Die Anweisung "+ print " von Python 2 wurde in " print () +" in Python 3 geändert.

Python 2 Python 3

print "Hello, World!"

print("Hello, World!")

+ exec +

Die Anweisung "+ exec +" von Python 2 wurde in eine Funktion geändert, die explizite Locals und Globals in Python 3 zulässt.

Python 2 Python 3

exec code

exec(code)

exec code in globals

exec(code, globals)

exec code in (globals, locals)

exec(code, globals, locals)

+ / + und + // +

Python 2 teilt die Stockwerke mit dem _Https: //www.digitalocean.com/community/tutorials/How-To-Do-Math-In-Python-3-With-Operators [Operator], Python 3 wird vorgestellt + // + für Bodenteilung.

Python 2 Python 3

5 / 2 = 2

5 / 2 = 2.5

5 // 2 = 2

Um diese Operatoren in Python 2 zu verwenden, import + division + from the `+ future + `Modul:

from __future__ import division

Lesen Sie mehr über division with integers .

+ Raise +

In Python 3 sind zum Auslösen von Ausnahmen mit Argumenten Klammern erforderlich, und strings kann nicht als Ausnahme verwendet werden.

Python 2 Python 3

raise Exception, args

raise Exception

raise Exception(args)

raise Exception, args, traceback

raise Exception(args).with_traceback(traceback)

raise "Error"

raise Exception("Error")

+ außer +

In Python 2 war es schwierig, mehrere Ausnahmen aufzulisten, aber das hat sich in Python 3 geändert.

Beachten Sie, dass + als + in Python 3 explizit mit_ + außer + _ verwendet wird

Python 2 Python 3

except Exception, variable:

except AnException as variable:

except (OneException, TwoException) as variable:

+ def +

In Python 2 können Funktionen Sequenzen wie tuples oder https://www.digitalocean.com/community/tutorials enthalten / verständnis-listen-in-python-3 [listen]. In Python 3 wurde dieses Entpacken entfernt.

Python 2 Python 3

def function(arg1, (x, y)):

def function(arg1, x_y): x, y = x_y

+ Ausdruck +

Die Backtick-Syntax von Python 2 existiert nicht mehr. Benutze + repr () + oder + str.format () + in Python 3.

Python 2 Python 3

+x = \`355/113\+`

x = repr(355/113):

String-Formatierung

String-Formatierungssyntax wurde von Python 2 zu Python 3 geändert .

Python 2 Python 3

"%d %s" % (i, s)

"{} {}".format(i, s)

"%d/%d=%f" % (355, 113, 355/113)

"{:d}/{:d}={:f}".format(355, 113, 355/113)

+ Klasse +

In Python 3._ muss nicht "+ object _` _" angegeben werden.

  • Python 2 *

class MyClass(object):
   pass
  • Python 3 *

class MyClass:
   pass

In Python3 werden Metaklassen mit dem Schlüsselwort _ + metaclass _ festgelegt .