Änderungen zwischen Python 2.x.x und Python 3.x.x und So konvertieren Sie Python 2.x.x in Python 3.x.x

Erstellt in: 2016-10-09 12:36:49, aktualisiert am: 2017-10-11 10:18:05
comments   2
hits   4926

Unterschiede und Änderungen in der Syntax von python2 und python3

Fast alle Python-2-Programme benötigen einige Modifikationen, um in der Python-3-Umgebung funktionieren zu können. Um diesen Umstieg zu vereinfachen, hat Python 3 ein 2to3-Utility-Skript, das Ihre Python-2-Programme als Input verwendet und automatisch in die Form von Python 3 umwandelt. Die Fallstudie: Chardet in Python 3 portieren beschreibt, wie das Skript funktioniert, und zeigt dann einige Situationen an, in denen es nicht automatisch repariert werden kann.

  • #### Print-Aussagen

In Python 2 ist print ein Satz. Was immer Sie ausdrucken möchten, können Sie tun, indem Sie es hinter dem Print-Keyword setzen. In Python 3 ist print () eine Funktion. Wie andere Funktionen erfordert print () das, was Sie ausdrucken möchten, als Parameter.

Notes Python 2 Python 3
print print()
print 1 print(1)
print 1,2 print(1,2)
print 1,2, print(1,2,end=’ ‘)
print >>sys.stderr,1,2,3 print(1,2,3, file=sys.stderr)
  1. Um eine leere Zeile auszugeben, muss print ohne Parameter aufgerufen werden ((() ◦
  2. Um einen einzelnen Wert auszugeben, muss man diesen Wert als print () ein Parameter verwenden.
  3. Für die Ausgabe zwei Werte, die durch einen Leerzeichen getrennt sind, mit zwei Parametern aufgerufen werden print ().
  4. In diesem Beispiel gibt es einige Tricks. In Python 2 wird die Ausgabe mit einem Leerzeichen getrennt, wenn Sie ein Komma ((,) als Ende der Print-Satz verwenden, und dann wird ein folgendes Leerzeichen ((trailing space) ausgeführt, ohne eine Rückfahrt ((carriage return) auszugeben. In Python 3 kann die gleiche Wirkung erzielt werden, indem end=’ ‘ als ein Keyword-Argument an print übermittelt wird.
  5. In Python 2 können Sie die gleiche Funktion ausführen, indem Sie die Ausgabe in eine Pipeline umleiten, indem Sie die Syntax von>>pipe_name verwenden, z. B. sys.stderr. In Python 3 können Sie die gleiche Funktion ausführen, indem Sie die Pipeline als Wert der Keyword-Parameter-Datei an print () übergeben. Die Parameter-Datei hat die Default-Wertung std.stdout, so dass die Neudefinition des Wertes print () in eine andere Pipeline ausführen lässt.
  • #### Unicode-Zeichenfolge

In Python 2 gibt es zwei Stringtypen:Unicode-ZeichenfolgeUndNicht-Unicode-StringIn Python 3 gibt es nur einen Typ:Unicode-Zeichenfolgen

Notes Python 2 Python 3
u’PapayaWhip’ ‘PapayaWhip’
ur’PapayaWhip\foo’ r’PapayaWhip\foo’

Unicode-Strings in Python 2 sind in Python 3 normale Strings, da sie in Python 3 immer in Unicode-Form sind. Die Unicode-Urschriftstring ((raw string) (() wird in Python nicht automatisch als Rückschrägstrich übersetzt.“) wird auch durch gewöhnliche Strings ersetzt, da in Python 3 alle ursprünglichen Strings in Unicode kodiert sind.

  • #### Globale Funktionen (Unicode)

In Python 2 gibt es zwei globale Funktionen, die ein Objekt zwangsweise in eine String umwandeln können: unicode ((), die ein Objekt in eine Unicode-String umwandelt, und str ((), die ein Objekt in eine nicht-Unicode-String umwandelt. In Python 3 gibt es nur einen Stringtyp, die Unicode-String, so dass die Str (() -Funktion alle Funktionen erfüllt.Die Unicode () -Funktion existiert in Python 3 nicht mehr.)

Notes Python 2 Python 3
unicode(anything) str(anything)
  • #### Langer, vollständiger

In Python 2 gibt es die Typen int und long für nicht-Floating-Zahlen. Der Maximalwert des Int-Types darf nicht größer als sys.maxint sein, und dieser Maximalwert ist plattformspezifisch. Ein langes Integer kann definiert werden, indem ein L an das Ende der Zahl angebracht wird, was offensichtlich eine größere Zahlenspanne als der Int-Typ darstellt. In Python 3 gibt es nur einen Integer-Typ int, der in den meisten Fällen den langen Integern in Python 2 ähnelt.

Weiterlesen: PEP 237: Einheitliche Lang- und Vollform.

Notes Python 2 Python 3
x = 1000000000000L x = 1000000000000
x = 0xFFFFFFFFFFFFL x = 0xFFFFFFFFFFFF
long(x) int(x)
type(x) is long type(x) is int
isinstance(x,long) isinstance(x,int)

In Python 2 wurde die Dezimalreihe langer Integer durch die Dezimalreihe gewöhnlicher Integer in Python 3 ersetzt. Die sechzehnstellige Langintegerform in Python 2 wurde in Python 3 durch die normalen sechzehnstelligen Integer ersetzt. In Python 3 gibt es keine langen Integer mehr.Die natürliche long () -Funktion ist auch nicht mehr vorhanden. Um eine Variable in ein Integer zu konvertieren, kann die int () -Funktion verwendet werden.。 Überprüfen Sie, ob eine Variable ein Integer ist, erhalten Sie ihren Datentyp und vergleichen Sie sie mit einem Int-Typ (der nicht lang ist). Sie können auch die Funktion ininstance (() verwenden, um den Datentyp zu überprüfen; nochmals betont, verwenden Sie int, statt long, um den Integertyp zu überprüfen.

  • #### <> Vergleichen der Operatoren

Python 2 unterstützt <> als Synonym für!=. Python 3 unterstützt nur!=, nicht mehr <>.

Notes Python 2 Python 3
if x <> y: if x != y:
if x <> y<> z: if x != y!= z:
  1. Einfach vergleichen.
  2. Vergleich zwischen drei relativ komplizierten Werten.
  • #### Wörterbuchmethode hat_key()

In Python 2 wird das “has” für die Wörterbuchobjekte verwendet._key() Methode zum Testen, ob ein Wörterbuch eine bestimmte Taste enthält ((key) Python 3 unterstützt diese Methode nicht mehr Sie müsseninOperator

Notes Python 2 Python 3
a_dictionary.has_key(‘PapayaWhip’) ‘PapayaWhip’ in a_dictionary
a_dictionary.has_key(x) or a_dictionary.has_key(y) x in a_dictionary or y in a_dictionary
a_dictionary.has_key(x or y) (x or y) in a_dictionary
a_dictionary.has_key(x + y) (x + y) in a_dictionary
x + a_dictionary.has_key(y) x + (y in a_dictionary)
  1. Die einfachste Form.
  2. Der Operator or hat eine niedrigere Priorität als der Operator in, so dass hier keine Klammern hinzugefügt werden.
  3. Auf der anderen Seite, aus dem gleichen Grund hat die Priorität von or unter der von in. Hier ist ein Klammer erforderlich. (‘) Anmerkung: Der Code hier ist völlig anders als in der vorherigen Zeile._Ein Schlüssel zum Wörterbuch.
  4. Der Operator in hat eine niedrigere Priorität als der Operator +, so dass diese Form des Codes technisch gesehen keine Klammern benötigt, aber 2 zu 3 wird hinzugefügt.
  5. Diese Form benötigt die Klammern, da in weniger Priorität hat als +。
  • #### Wörterbuchmethoden, die eine Liste zurückgeben

In Python 2 sind die Rückgabewerte vieler Wörterbuchmethoden Listen. Die am häufigsten verwendeten Methoden enthalten Keys, Items und Values. In Python 3 wurden die Rückgabewerte für alle Methoden in Dynamic View umgewandelt. In einigen Kontextumgebungen hat diese Änderung keine Auswirkungen.

Notes Python 2 Python 3
a_dictionary.keys() list(a_dictionary.keys())
a_dictionary.items() list(a_dictionary.items())
a_dictionary.iterkeys() iter(a_dictionary.keys())
[i for iin a_dictionary.iterkeys()] [i for iin a_dictionary.keys()]
min(a_dictionary.keys()) no change
  1. Die Funktion list () konvertiert die Rückgabewerte von keys () in eine statische Liste. Aus Sicherheitsgründen kann 2to3 Fehler melden. Solcher Code funktioniert, aber für die Verwendung von Ansichten ist es etwas weniger effizient.
  2. Dies ist eine andere Ansicht, die die Umwandlung der () Methode zu () Methode in () Methode in () Methode umwandelt. Die Umwandlung der () Methode zu () Methode, die die Werte zurückgibt, ist ebenfalls dieselbe.
  3. In Python 3 werden iterkeys () nicht mehr unterstützt. Wenn nötig, wird der Rückgabewert von keys () zu einem iterator umgewandelt. 4 2to3 kann erkennen, dass die Methode iterkeys () in der Parsing der Liste verwendet wird, und sie dann in die Methode keys () in Python 3 umwandeln, ohne dass zusätzliche iter () verwendet werden müssen, um ihre Rückgabewerte zu verpacken. 5 2to3 kann auch erkennen, dass die Rückgabewerte der Methode keys (()) sofort an eine andere Funktion übertragen werden, die die gesamte Sequenz durchläuft, so dass es nicht notwendig ist, die Rückgabewerte von keys (()) zuerst in eine Liste umzuwandeln. Im Gegenteil, die Min () Funktion wird gerne die Ansicht durchlaufen.
  • #### Umbenannte oder neu organisierte Module

Von Python 2 bis Python 3 wurden einige Module in der Standard-Curry umbenannt. Einige miteinander verbundene Module wurden zusammengefasst oder neu organisiert, um diese Verbindung logischer zu machen.

  • http In Python 3 werden mehrere verwandte HTTP-Module zu einem separaten Paket zusammengefasst: http.
Notes Python 2 Python 3
import httplib import http.client
import Cookie import http.cookies
import cookielib import http.cookiejar
import BaseHTTPServer
import SimpleHTTPServer
import CGIHttpServer
import http.server

Das http.client Modul implementiert eine untergeordnete Bibliothek, die verwendet werden kann, um HTTP-Ressourcen anzufordern und HTTP-Antworten zu analysieren. Das http.cookies Modul bietet eine schöne Python-Schnittstelle, um Cookies zu erhalten, die über den HTTP-Header Set-Cookie gesendet werden. Die gängigen Browser speichern Cookies als Dateien auf der Festplatte, die von dem http.cookiejar-Modul bearbeitet werden können. Das http.server Modul implementiert einen grundlegenden HTTP-Server

  • urllib In Python 2 gibt es einige Module zur Analyse, Codierung und Erfassung von URLs, die sich aber wie ein Mauswurf überschneiden. In Python 3 werden diese Module in ein eigenes Paket, urllib, umgewandelt.
Notes Python 2 Python 3
import urllib import urllib.request
urllib.parse,urllib.error
import urllib2 import urllib.request
urllib.error
import urlparse import urllib.parse
import robotparser import urllib.robotparser
from urllib import FancyURLopener
from urllib import urlencode
from urllib.request import FancyURLopener
from urllib.parse import urlencode
from urllib2 import Request
from urllib2 import HTTPError
from urllib.request import Request
from urllib.error import HTTPError

In der Vergangenheit hatte das urllib-Modul in Python 2 verschiedene Funktionen, darunter die urlopen () -Funktion, mit der Daten abgerufen werden können. Es ist auch nützlich, die URL in seine Bestandteile zu unterteilen, wie z. B. die Splittype () -Funktion, die Splithost () -Funktion und die Splituser () -Funktion. In der neuen urllib-Package sind diese Funktionen logischer organisiert. In Python 3 wurden die früheren Module von urllib2 in die urllib-Package integriert. Gleichzeitig werden alle Ihre Lieblings-Dinge in urllib2 in Python 3 in einem urllib-Modul erscheinen, wie beispielsweise build_Die Opener-Methode, die Request-Objekte, der HTTPBasic AuthHandler und die Friends-Methode. Das urllib.parse-Modul in Python 3 enthält alle Parser-Funktionen des urlparse-Moduls in Python 2. Das Modul urllib.robotparse analysiert die Datei robots.txt. Die FancyURLopener-Klasse, die HTTP-Weiterleitungen und andere Statuscodes verarbeitet, ist in Python 3 im Modul urllib.request weiterhin gültig. Die Funktion △urlencode () wurde in urllib.parse übertragen. Request-Objekte sind in urllib.request weiterhin gültig, aber Konstanten wie HTTPError wurden in urllib.error übertragen. Habe ich erwähnt, dass 2to3 auch deine Funktionsaufrufe umschreibt? Zum Beispiel, wenn du in deinem Python 2-Code das Modul urllib importiert hast und die Funktion urllib.urlopen () aufrufst, um die Daten abzurufen, wird 2to3 gleichzeitig die Import-Sätze und die Funktionsaufrufe ändern.

Notes Python 2 Python 3
import urllib print urllib.urlopen(’http://diveintopython3.org/‘).read() import urllib.request, urllib.parse, urllib.error
print(urllib.request.urlopen(’http://diveintopython3.org/‘).read())
  • dbm Alle DBM-Klone befinden sich jetzt in einem separaten Paket, der dbm. Wenn Sie eine bestimmte Variante benötigen, z. B. GNUDBM, können Sie das entsprechende Modul in das dbm-Paket importieren.
Notes Python 2 Python 3
import dbm import dbm.ndbm
import gdbm import dbm.gnu
import dbhash import dbm.bsd
import dumbdbm import dbm.dumb
import anydbm
import whichdb
import dbm
  • xmlrpc XML-RPC ist eine leichte Methode zur Durchführung von Remote-RPC-Aufrufen über das HTTP-Protokoll. Einige XML-RPC-Client- und XML-RPC-Server-Implementierungsbibliotheken wurden nun in ein eigenes Paket, xmlrpc, zusammengefasst.
Notes Python 2 Python 3
import xmlrpclib import xmlrpc.client
import DocXMLRPCServer
import SimpleXMLRPCServer
import xmlrpc.server
  • #### Weitere Module
Notes Python 2 Python 3
try:
  import cStringIO as StringIO
except ImportError:
  import StringIO
import io
try:
  import cPickle as pickle
except ImportError: 
  import pickle
import pickle
import _builtin_ import builtins
import copy_reg import copyreg
import Queue import queue
import SocketServer import socketserver
import ConfigParser import configparser
import repr import reprlib
import commands import subprocess
  1. In Python 2 würden Sie dies normalerweise tun, indem Sie zuerst versuchen, cStringIO als Ersatz für StringIO zu importieren, und wenn dies fehlschlägt, dann StringIO importieren. Tun Sie dies nicht in Python 3; das io-Modul hilft Ihnen dabei. Es wird die schnellste verfügbare Implementierungsmethode finden und sie automatisch verwenden.
  2. Im Python 2 ist es auch eine nützliche Methode, die schnellste Pickle-Implementierung zu importieren, ähnlich wie oben. In Python 3 wird das Pickle-Modul automatisch für Sie verarbeitet, also tun Sie das nicht mehr.
  3. Das Builtins-Modul enthält die globalen Funktionen, Klassen und Konstanten, die in der gesamten Python-Sprache verwendet werden. Eine bestimmte Funktion im Builtins-Modul neu zu definieren bedeutet, die globale Funktion überall neu zu definieren. Das klingt mächtig, aber es ist auch beängstigend.
  4. Das CopyReg Modul unterstützt die Verwendung von Pickle Modulen für benutzerdefinierte Typen, die in der Sprache C definiert sind.
  5. Die Queue Module ermöglicht eine Multi-Producer, Multi-Consumer Queue.
  6. Das socketserver Modul bietet eine allgemeine Grundklasse für die Implementierung verschiedener Socketserver.
  7. Das Modul configparser wird verwendet, um die config-style INI-Datei zu analysieren.
  8. Das reprlib-Modul implementiert die eingebaute Funktion repr () neu und fügt die Kontrolle über die Länge der Zeichenkette hinzu, bevor sie unterbrochen wird.
  9. Das Subprocess Modul erlaubt es Ihnen, Subprozesse zu erstellen, sich an ihre Pipelines anzuschließen und ihre Rückgabewerte zu erhalten.
  • Relative Importe im Paket

Ein Paket ist eine einzelne Entität, die aus einer Gruppe zusammenhängender Module besteht. In Python 2 verwenden Sie Import foo oder from foo import Bar, um die Module im gleichen Paket miteinander zu verweisen. Der Python 2-Interpreter sucht zuerst in der aktuellen Verzeichnis nach foo.py und dann in der Python-Suchroute ((sys.path)).

Angenommen, Sie haben mehrere Dateien in einem Verzeichnis:

chardet/ | +–init.py | +–constants.py | +–mbcharsetprober.py | +–universaldetector.py

Angenommen, universaldetector.py benötigt die gesamte Import-Klasse constants.py und zusätzlich eine Klasse von mbcharsetprober.py. Was würden Sie tun?

Notes Python 2 Python 3
import constants from .import constants
from mbcharsetprober import MultiByteCharSetProber from .mbcharsetprober import MultiByteCharsetProber
  1. Wenn Sie ein ganzes Modul von einem anderen Teil des Pakets importieren möchten, verwenden Sie die neue from .import-Syntax. Der Satz (((.) gibt den relativen Pfad zwischen der aktuellen Datei ((universaldetector.py) und der Datei, die Sie importieren möchten ((constants.py). In diesem Beispiel befinden sich die beiden Dateien in demselben Verzeichnis, so dass ein einzelner Satz verwendet wird.
  2. Um eine bestimmte Klasse oder Funktion direkt aus einem anderen Modul in den Namensraum Ihres Moduls zu importieren, fügen Sie den relativen Pfad in den benötigten Modulnamen hinzu und entfernen Sie den letzten Slash ((slash)). In diesem Fall befindet sich mbcharsetprober.py in demselben Verzeichnis wie universaldetector.py, so dass der relativen Pfad als Satzzeichen bezeichnet wird. Sie können auch aus dem Elternverzeichnis ((from .. import anothermodule) oder aus dem Unterverzeichnis importieren.
  • #### Die iterative Methode (next)

In Python 2 gibt es eine next () -Methode, die den nächsten Punkt in der Folge zurückgibt. In Python 3 funktioniert das ebenfalls, aber jetzt gibt es eine neue globale Funktion next () - die einen next () -Methode als Parameter verwendet.

Notes Python 2 Python 3
anIterator.next() next(anIterator)
a_function_that_returns_an_iterator().next() next(a_function_that_returns_an_iterator())

|③|class A:
  def next(self):
  pass|class A:
  def next(self):
  pass| |④|class A:
  def next(self, x, y):
  pass|no change | |⑤|next = 42
for an_iterator in a_sequence_of_iterators:
  an_iterator.next()|next = 42
for an_iterator in a_sequence_of_iterators:
  an_iterator.next() | 1. Einfaches Beispiel: Sie rufen nicht mehr die next () -Methode eines Iterators an, sondern geben den Iterator selbst als Parameter an die globale Funktion next () weiter. 2. Wenn Sie eine Funktion des Intuitors haben, rufen Sie diese auf und geben die Ergebnisse als Parameter an die next () -Funktion weiter. Die 2to3-Skripte sind intelligent genug, um diese Umwandlung korrekt durchzuführen. 3. Wenn Sie eine eigene Klasse definieren und sie dann als Iterator verwenden, können Sie in Python 3 eine spezielle Methode definieren, um eine eigene Klasse zu definieren.next() um es zu realisieren 4. Wenn Sie eine Klasse definieren, in der es eine next () gibt, die ein oder mehrere Parameter verwendet, wird sie bei der Ausführung von 2 zu 3 nicht bewegt. Diese Klasse kann nicht als Intuitor verwendet werden, da ihre next () -Methode mit Parametern versehen ist. 5. Das ist ein bisschen kompliziert. Wenn Sie zufällig eine lokale Variable namens next haben, hat diese in Python 3 eine höhere Priorität als die globale Funktion next ((() }}. In diesem Fall benötigen Sie eine spezielle Methode, um den Iterator aufzurufen.next() um das nächste Element in der Sequenz zu erhalten. Oder, Sie können den Code so umbauen, dass die lokale Variable nicht als next bezeichnet wird, aber 2to3 wird das nicht für Sie tun.

  • #### Globaler Funktionsfilter

In Python 2 gibt die Filter() -Methode eine Liste zurück, die durch eine Funktion mit dem Wert True oder False erstellt wird, um jedes Element der Sequenz zu testen. In Python 3 gibt die Filter() -Funktion einen Iterator zurück, der keine Liste mehr ist.

Notes Python 2 Python 3
filter(a_function, a_sequence) list(filter(a_function, a_sequence))
list(filter(a_function, a_sequence)) no change
filter(None, a_sequence) [i for iin a_sequence if i]
for i in filter(None, a_sequence): no change
[i for iin filter(a_function, a_sequence)] no change
  1. Im einfachsten Fall wickelt 2to3 den Filter mit einer list () -Funktion, die ihre Parameter durchläuft und eine Liste zurückgibt.
  2. Wenn jedoch der Aufruf von filter() bereits mit dem Paket list() verarbeitet wurde, wird 2to3 nicht mehr verarbeitet, da es in diesem Fall unerheblich ist, ob der zurückgegebene Wert von filter() ein iterativer Wert ist.
  3. Um die spezielle Syntax von filter ((None, …) zu behandeln, wird dieser Aufruf von 2 zu 3 syntaxis-äquivalent in eine Liste-Analyse umgewandelt.
  4. Da die For-Zyklus durch die gesamte Sequenz führt, ist keine Änderung erforderlich.
  5. Wie oben, keine Änderungen notwendig, da die Liste durchläuft die gesamte Sequenz, und selbst wenn der Filter () einen Iterator zurückgibt, kann er wie der vorherige Filter () die Liste zurückgeben.
  • #### Globale Funktionskarte

Wie bei der Änderung von filter () gibt die map () -Funktion nun einen Iterator zurück. In Python 2 gibt sie eine Liste zurück.

Notes Python 2 Python 3
map(a_function,‘PapayaWhip’) list(map(a_function,‘PapayaWhip’))
map(None,‘PapayaWhip’) list(‘PapayaWhip’)
map(lambda x: x+1,range(42)) [x+1for x in range(42)]
for i in map(a_function, a_sequence): no change
[i for iin map(a_function,a_sequence)] no change
  1. Ähnlich wie beim Filter () wird der 2to3-Aufruf mit einer list () -Funktion als Map () -Aufruf verpackt.
  2. Für die spezielle Map ((None, …) -Syntax, ähnlich wie für Filter ((None, …), wird 2to3 diese in eine gleichwertige Aufforderung umgewandelt, die list (() verwendet.
  3. Wenn das erste Parameter von map () eine Lambda-Funktion ist, wird 2to3 diese gleichwertig in eine Listenparameter umwandeln.
  4. Für die For-Schleife, die die gesamte Sequenz durchläuft, sind keine Änderungen erforderlich.
  5. Nochmals, hier ist keine Änderung nötig, da die List-Analyse die gesamte Sequenz durchläuft, und es funktioniert auch dann, wenn die Rückgabewert für map () ein Injector ist und nicht eine Liste.
  • #### Die globale Funktion reduzieren

In Python 3 wurde die Funktion reduce (()) aus dem globalen Namensraum entfernt und wird nun im Modul fucntools angebracht.

Notes Python 2 Python 3
reduce(a, b, c) from functools import reduce reduce(a, b, c)
  • #### Globale Funktion apply ())

Python 2 hat eine globale Funktion, die apply () genannt wird, die eine Funktion f und eine Liste verwendet.[a, b, c] als Parameter wird f ((a, b, c) angeboten. Sie können diese Funktion auch direkt anrufen und eine Sternchen vor der Liste hinzufügen:*In Python 3 existiert die Funktion “apply() ” nicht mehr; es muss eine Sternzeichenmarkierung verwendet werden.

Notes Python 2 Python 3
apply(a_function, a_list_of_args) a_function(*a_list_of_args)
apply(a_function, a_list_of_args, a_dictionary_of_named_args) a_function(*a_list_of_args,**a_dictionary_of_named_args)
apply(a_function, a_list_of_args+ z) a_function(*a_list_of_args+ z)
apply(aModule.a_function, a_list_of_args) aModule.a_function(*a_list_of_args)
  1. Die einfachste Form, die man nehmen kann, ist die Parameterliste (([Wie bei a, b, c] wird die Funktion erst mit einem Sternchen aufgerufen. Das ist gleichbedeutend mit der Funktion apply (()) in Python 2.
  2. In Python 2 kann die Funktion apply() tatsächlich mit 3 Parametern versehen werden: einer Funktion, einer Parameterliste und einem Dictionary of named arguments. In Python 3 können Sie die Parameterliste mit einem Sternzeichen versehen:*), zwei Sterne vor den Namensparametern des Wörterbuchs ((**Das ist die Art und Weise, wie wir das tun können.
  3. Der Operator + wird hier als Funktion der Linkliste verwendet, und hat eine höhere Priorität als der Operator*, so dass keine zusätzlichen Klammern um a_list_of_args + z hinzugefügt werden. 4, 2to3-Skripte sind intelligent genug, um komplexe Apply () -Aufrufe zu konvertieren, einschließlich der Funktionen, die im Importmodul aufgerufen werden.
  • #### Globale Funktion intern ()

In Python 2 können Sie die Funktion intern () auf eine String beschränken, um die Funktion intern () zu optimieren. In Python 3 wird die Funktion intern () in das sys-Modul übertragen.

Notes Python 2 Python 3
intern(aString) sys.intern(aString)
  • #### Exec-Sätze

Wie die Print-Anweisung in Python 3 zu einer Funktion wird, so auch die Exec-Anweisung. Die Exec () -Funktion verwendet eine String, die beliebigen Python-Code enthält, als Parameter, und führt sie dann aus, als ob sie eine Anweisung oder einen Ausdruck ausführen würde. Exec () ist ähnlich wie eval () aber noch stärker und geschickter. Eval () -Funktion kann nur einen einzelnen Ausdruck ausführen, aber Exec () -Funktion kann mehrere Anweisungen ausführen, Import () und Funktionserklärungen ausführen.

Notes Python 2 Python 3

|①|exec codeString|exec(codeString) |②|exec codeString in a_global_namespace|exec(codeString, a_global_namespace)| |③|exec codeString in a_global_namespace, a_local_namespace|exec(codeString, a_global_namespace,a_local_namespace)| 1. In seiner einfachsten Form, weil exec (()) jetzt eine Funktion ist und nicht eine Aussage, wird 2to3 diesen String-Form-Code in Klammern umgeben. 2. Die exec-Anweisung in Python 2 kann einen Namensraum angeben, in dem der Code in diesem privaten Raum aus globalen Objekten ausgeführt wird. Python 3 hat diese Funktion; Sie müssen nur den Namensraum als zweites Parameter an die exec () -Funktion weitergeben. 3. Noch erstaunlicher ist, dass die exec-Anweisung in Python 2 auch einen lokalen Namensraum (wie z. B. eine Variable, die in einer Funktion deklariert wird) benennen kann. In Python 3 hat die exec () -Funktion diese Funktion ebenfalls.

  • #### Execfile-Aussagen

Wie die vorherigen Exec-Sätze kann auch die Execfile-Sätze in Python 2 Strings verwenden, um Python-Code auszuführen. In Python 3 wurde die Execfile-Sätze entfernt. Wenn Sie wirklich Python-Code in einer Datei ausführen möchten, aber Sie möchten sie nicht importieren, können Sie diese Datei öffnen, ihre Inhalte lesen und dann die Compile () -Funktion aufrufen, um den Python-Interpreter zu zwingen, den Code zu kompilieren, und dann die neue Exec () -Funktion aufrufen.

Notes Python 2 Python 3
execfile(‘a_filename’) exec(compile(open(‘a_filename’).read(),‘a_filename’,‘exec’))
  • #### repr (mit Anführungszeichen)

In Python 2 gibt es eine Möglichkeit, ein beliebiges Objekt in einer Zeichenfolge zu erhalten, indem man es in Rückzugszeichen einpackt, wie z.B.xIn Python 3 existiert diese Fähigkeit noch, aber Sie können diese Zeichen nicht mehr mit Rückzugszeichen erhalten. Sie müssen die globale Funktion repr () verwenden.

Notes Python 2 Python 3
`x` repr(x)
`‘PapayaWhip’ + `2`` repr(‘PapayaWhip’+ repr(2))
  1. Denken Sie daran, dass x alles sein kann: eine Klasse, eine Funktion, ein Modul, ein grundlegender Datentyp usw.
  2. In Python 2 können Rückzugszeichen eingebettet werden, was zu diesem verwirrenden (aber wirksamen) Ausdruck .2to3 führt, der intelligent genug ist, diesen eingebetteten Aufruf in die repr () -Funktion umzuwandeln.
  • #### Versuch… außer Satz

Von Python 2 zu Python 3 hat sich die Syntax für die Erfassung von Ausnahmen etwas verändert.

Notes Python 2 Python 3
try:
  import mymodule
except ImportError, e
  pass
try:
  import mymodule
except ImportError as e:
  pass
try:
  import mymodule
except (RuntimeError, ImportError), e
  pass
try:
  import mymodule
except (RuntimeError, ImportError) as e:
  pass
try:
  import mymodule
except ImportError:
  pass
no change
try:
  import mymodule
except:
  pass
no change
  1. Python 3 verwendet ein neues Schlüsselwort, as。, das im Vergleich zu Python 2 ein Komma nach dem Ausnahmetyp hinzufügt
  2. Das Schlüsselwort as kann auch verwendet werden, wenn mehrere Typen von Ausnahmen gleichzeitig erfasst werden.
  3. Wenn Sie eine Ausnahme feststellen, aber nicht darauf achten, die Ausnahme selbst zu besuchen, ist die Syntax von Python 2 und Python 3 identisch.
  4. Genauso, wenn man eine Sicherungsmethode (Fallback) verwendet, um alle Ausnahmen zu erfassen, ist die Syntax von Python 2 und Python 3 gleich.
  5. Wenn Sie ein Modul importieren (oder in den meisten anderen Fällen), sollten Sie diese Methode auf keinen Fall verwenden (siehe Fallback oben). Andernfalls kann das Programm Ausnahmen wie KeyboardInterrupt (wenn der Benutzer das Programm unterbricht, indem er Ctrl-C drückt) erfassen, was die Debugging erschwert.
  • #### raise-Satz

In Python 3 gibt es eine kleine Änderung in der Syntax, um eine benutzerdefinierte Ausnahme zu entfernen.

Notes Python 2 Python 3
raise MyException unchanged
raise MyException,‘error message’ raise MyException(‘error message’)
raise MyException,‘error message’, a_traceback raise MyException(‘errormessage’).with_traceback(a_traceback)
raise ‘error message’ unsupported
  1. Ausnahmen ohne benutzerdefinierte Fehlermeldungen, die in ihrer einfachsten Form die Grammatik nicht verändern.
  2. Wenn Sie eine Ausnahme mit einer benutzerdefinierten Fehlermeldung auswerfen wollen, ist die Veränderung sichtbar. Python 2 trennt die Ausnahme- und die Fehlermeldung durch ein Komma; Python 3 übermittelt die Fehlermeldung als Parameter an die Ausnahme.
  3. Python 2 unterstützt eine kompliziertere Syntax, um eine Ausnahme mit einer benutzerdefinierten Rückverfolgung zu erzeugen. In Python 3 können Sie dies auch tun, aber die Syntax ist völlig anders.
  4. In Python 2 können Sie eine Ausnahme ohne Ausnahme-Klasse, nur eine Ausnahme-Meldung, auswerfen. In Python 3 wird diese Form nicht mehr unterstützt. 2to3 wird Sie warnen, dass es diese Syntax nicht automatisch korrigieren kann.
  • #### Die Throw-Methode des Generators

In Python 2 hat der Generator eine Throw () -Methode. Der Aufruf von a_generator.throw () wirft eine Ausnahme aus, wenn der Generator unterbrochen wird, und gibt dann den nächsten Wert zurück, der von der Generator-Funktion abgerufen wird. In Python 3 ist diese Funktion immer noch verfügbar, jedoch etwas anders grammatisch.

Notes Python 2 Python 3
a_generator.throw(MyException) no change
a_generator.throw(MyException,‘error message’) a_generator.throw(MyException(‘error message’))
a_generator.throw(‘error message’) unsupported
  1. In seiner einfachsten Form wirft der Generator Ausnahmen ohne benutzerdefinierte Fehlermeldungen hervor. In diesem Fall ändert sich die Syntax von Python 2 zu Python 3 nicht.
  2. Wenn der Generator eine Ausnahme mit einer benutzerdefinierten Fehlermeldung auslöst, müssen Sie diese Fehlermeldung an die Ausnahme-Klasse weiterleiten, um sie zu instanzialisieren.
  3. Python 2 unterstützt auch Ausnahmen, die nur Ausnahmeinformationen enthalten. Python 3 unterstützt diese Syntax nicht, und 2to3 zeigt eine Warnmeldung an, dass Sie den Code manuell reparieren müssen.
  • #### Die globale Funktion xrange

In Python 2 gibt es zwei Möglichkeiten, Zahlen in einem bestimmten Bereich zu erhalten: range (), die eine Liste zurückgibt, und range (), die einen Iterator zurückgibt. In Python 3 gibt es range (), der den Iterator zurückgibt, und xrange (), der nicht mehr existiert.

Notes Python 2 Python 3
xrange(10) range(10)
a_list = range(10) a_list = list(range(10))
[i for iin xrange(10)] [i for iin range(10)]
for i in range(10): no change
sum(range(10)) no change
  1. In der einfachsten Situation würde 2to3 einfach xrange () in range () umwandeln.
  2. Wenn Ihr Python 2-Code mit range () verwendet wird, weiß 2to3 nicht, ob Sie eine Liste benötigen oder ob ein iterator auch funktioniert. Aus Vorsicht kann 2to3 einen Fehler melden und dann list () verwenden, um die zurückgegebenen Werte von range () in den Listentyp zu konvertieren.
  3. Wenn die Funktion xrange () in der Listenanalyse vorhanden ist, ist es nicht notwendig, ihre Rückgabe in eine Liste zu konvertieren, da die Listenanalyse für die Intuitoren gleichermaßen wirksam ist.
  4. In ähnlicher Weise wirkt der for-Zyklus auch auf die Intuitoren, so dass hier nichts verändert wird.
  5. Die Funktion sum ((() funktioniert als Intuitor, so dass 2to3 hier keine Änderungen vornimmt. Dies gilt auch für min (((), max (((), sum (((), list (((), tuple (((), set (((), sorted (((), any (((), all ((()), so wie die Wörterbuchmethode, die den Wert als view (((view) und nicht mehr als Liste zurückgibt.
  • #### Die globalen Funktionen raw_input () und input ()

In Python 2 gibt es zwei globale Funktionen, die auf der Befehlszeile benutzeranfordernd eingegeben werden. Die erste heißt input (), die darauf wartet, dass der Benutzer einen Python-Ausdruck eingibt (), und dann ein Ergebnis zurückgibt (). Die zweite heißt raw_input (), und was der Benutzer eingibt, was er zurückgibt ().

Notes Python 2 Python 3
raw_input() input()
raw_input(‘prompt’) input(‘prompt’)
input() eval(input())
  1. In der einfachsten Form wird raw_input () durch input () ersetzt.
  2. In Python 2 kann die Raw_input () -Funktion einen Hinweis als Parameter angeben. In Python 3 ist diese Funktion erhalten.
  3. Wenn Sie wirklich den Benutzer bitten möchten, einen Python-Ausdruck einzugeben, können Sie das Ergebnis berechnen, indem Sie die Funktion input () aufrufen und den zurückgegebenen Wert an eval () () weiterleiten.
  • #### Funktionseigenschaft

In Python 2 kann der Code der Funktion auf die speziellen Eigenschaften der Funktion zugreifen. In Python 3 wurden diese Eigenschaften umbenannt, um die Funktion zu überwachen.

Notes Python 2 Python 3
a_function.func_name a_function._name_
a_function.func_doc a_function._doc_
a_function.func_defaults a_function._defaults_
a_function.func_dict a_function._dict_
a_function.func_closure a_function._closure_
a_function.func_globals a_function._globals_
a_function.func_code a_function._code_

1、name_Die _attribute ((originalfunc_name) enthält den Namen der Funktion。 2、docattribute ((originalfuncdoc) enthält die Dokumentstring, die Sie im Quellcode der Funktion definiert haben ((docstring)) 3、defaultsattribute ((originalfunc_defaults) ist eine Array, die die Default-Werte der Parameter speichert. 4、dictattribute ((originalfunc_dict) ist ein Namensraum, der die Eigenschaften einer beliebigen Funktion unterstützt. 5、closureattribute ((originalfunc_closure) ist eine Subgruppe aus Cell-Objekten, die die Bindung einer Funktion an eine freie Variable ((free variable)) enthält. 6、globalsattribute ((originallyfunc_globals) ist ein Verweis auf das globale Namensraum eines Moduls, in dem die Funktion selbst definiert ist. 7、code__attribute ((originalfunc_code) ist ein Codeobjekt, das die kompilierte Funktion darstellt.

  • #### I/O-Methoden xreadlines

In Python 2 gibt es eine xreadlines () -Methode für die Dateiobjekte, die einen Iterator zurückgibt, der eine Zeile der Datei auf einmal liest. Dies ist besonders nützlich im For-Loop. In der Tat haben spätere Versionen von Python 2 diese Funktion dem Dateiobjekt selbst hinzugefügt.

In Python 3 ist die xreadlines () -Methode nicht mehr verfügbar. 2to3 kann einfache Situationen lösen, aber einige Randfälle erfordern eine manuelle Intervention.

Notes Python 2 Python 3
for line in a_file.xreadlines(): for line in a_file:
for line in a_file.xreadlines(5): no change (broken)
  1. Wenn Sie zuvor xreadlines ohne Parameter () aufgerufen haben, wird 2to3 sie in die Dateiobjekte selbst umwandeln. In Python 3 kann der Code nach dieser Umwandlung die gleiche Arbeit verrichten wie zuvor: Lesen Sie eine Zeile der Datei und führen Sie dann den For-Kreis durch.
  2. Wenn Sie zuvor mit einem Argument ((Zahl der Linien pro Lesung) xreadlines () aufgerufen haben, kann 2to3 die Umstellung von Python 2 auf Python 3 nicht für Sie durchführen, und Ihr Code wird so versagen: AttributeError: ‘_io.TextIOWrapper’ object has no attribute ‘xreadlines’. Sie können die xreadlines () manuell in readlines () umwandeln, damit der Code in Python 3 funktioniert. Die Readline () -Methode gibt in Python 3 einen Iterator zurück, so dass sie nicht so effizient ist wie die xreadlines () in Python 2.
  • #### Lambda-Funktionen mit mehreren Parametern anstelle von Arrays

In Python 2 können Sie eine anonyme Lambda-Funktion definieren, die es ermöglicht, mehrere Parameter zu empfangen, indem Sie die Elementanzahl der als Parameter angegebenen Bausteine definieren. Tatsächlich entpackt der Python 2-Interpreter diese Bausteine in benannte Argumente, die Sie dann in der Lambda-Funktion zitieren können. In Python 3 können Sie immer noch eine Bausteine als Parameter der Lambda-Funktion übermitteln, aber der Python-Interpreter wird sie nicht als benannte Parameter analysieren.

Notes Python 2 Python 3
lambda (x,): x+ f(x) lambda x1: x1[0]+f(x1[0])
lambda (x, y): x+f(y) lambda x_y: x_y[0]+f(x_y[1])
lambda (x,(y,z)): x+ y+ z lambda x_y_z: x_y_z[0]+x_y_z[1][0]+ x_y_z[1][1]
lambda x, y, z: x+y + z unchanged
  1. Wenn Sie eine Lambda-Funktion definiert haben, die eine Array mit einem Element als Argument verwendet, wird diese in Python 3 in eine Array mit einem Element mit x1 umgewandelt.[Die Lambda-Funktion, die in [0] zitiert wird, ist eine Funktion, die im 2to3-Skript automatisch erzeugt wird, basierend auf den Naming-Parametern in der ursprünglichen Metamethode.
  2. Die Lambda-Funktion, die die zwei Elemente enthaltende Gruppe ((x, y) als Parameter verwendet, wird in x_y umgewandelt, die zwei Positionsparameter hat, d.h. x_y[0] und x_y[1]。 3 2 bis 3 Skripte können sogar Lambda-Funktionen mit den Arrays der eingebetteten Namensparameter als Parameter behandeln. Der ergebende Code ist etwas schwer zu lesen, aber er funktioniert in Python 3 genauso wie der ursprüngliche Code in Python 2.
  3. Sie können eine Lambda-Funktion mit mehreren Parametern definieren. Wenn keine Parameter um die Parameter herum sind, wird Python 2 sie als eine Lambda-Funktion mit mehreren Parametern behandeln; in diesem Lambda-Funktionskörper werden die Parameter durch Namen bezeichnet, wie in anderen Funktionsarten. Diese Syntax ist in Python 3 noch gültig.
  • #### Spezielle Methodenattribute

In Python 2 können Klassemethoden auf ihre Klassenobjekte zugreifen und auch auf die Methodenobjekte selbst. Im_self ist das Instanzobjekt der Klasse; im_func ist das Funktionsobjekt und im_class ist die Klasse selbst. In Python 3 werden diese Attribute umbenannt, um die Namenskonventionen für andere Attribute zu befolgen.

Notes Python 2 Python 3
aClassInstance.aClassMethod.im_func aClassInstance.aClassMethod._func_
aClassInstance.aClassMethod.im_self aClassInstance.aClassMethod._self_
aClassInstance.aClassMethod.im_class aClassInstance.aClassMethod._self_._class_
  • #### nonzero Spezielle Methode

In Python 2 können Sie eigene Klassen erstellen, die Sie in einem boolean context verwenden können. Zum Beispiel können Sie diese Klasse instanzialisieren und dieses Instanzobjekt in einer if-Anweisung verwenden.nonzero() Methode, die einen Wert von True oder False zurückgibt, wird nur dann aufgerufen, wenn die Instanzobjekte in einem Boolean-Kontext sind. In Python 3 kann man immer noch die gleiche Funktion ausführen, aber der Name dieser speziellen Methode wirdbool()。

Notes Python 2 Python 3

|①|class A:
  def nonzero(self):
  pass|class A:
  def bool(self):
  pass |②|class A:
  def nonzero(self, x, y):
  pass|no change| 1. Python 3 ruft, wenn ein Klassenobjekt im Bure-Kontext verwendet wirdbool_Das ist eine sehr schwierige Aufgabe.nonzero()。 2. Wenn Sie jedoch eine Definition haben, die zwei Parameter verwendetnonzero__() Methode: Die 2to3-Skripte nehmen an, dass die von Ihnen definierte Methode für andere Zwecke verwendet wird und daher keine Änderungen am Code vorgenommen werden.

  • #### Achtfache

Zwischen Python 2 und Python 3 gibt es eine leichte Änderung in der Grammatik der Definition der oktalen Zahlen.

Notes Python 2 Python 3
x = 0755 x = 0o755
  • #### sys.maxint

Die sys.maxint-Konstante ist nicht mehr präzise, da die langen Integer und die Integer miteinander kombiniert wurden. Da sie jedoch für die Erfassung der Fähigkeiten bestimmter Plattformen nützlich ist, wurde sie in Python 3 beibehalten und als sys.maxsize umbenannt.

Notes Python 2 Python 3
from sys importmaxint from sys importmaxsize
a_function(sys.maxint) a_function(sys.maxsize)
  1. maxint wird zu maxsize.
  2. Alle sys.maxint werden zu sys.maxsize
  • #### Globale Funktionen sind anrufbar (callable)

In Python 2 können Sie mit der globalen Funktion callable ((() überprüfen, ob ein Objekt aufgerufen werden kann. In Python 3 wurde diese globale Funktion abgeschafft. Um zu überprüfen, ob ein Objekt aufgerufen werden kann, können Sie eine spezielle Methode überprüfen.__call_Die Existenz von ______.

Notes Python 2 Python 3
callable(anything) hasattr(anything,’_call_’)
  • #### Globale Funktion (zip)

In Python 2 kann die globale Funktion zip() beliebige Sequenzen als Parameter verwenden, und sie gibt eine Liste von Metatomen zurück. Die erste Metatome enthält das erste Element jeder Sequenz; die zweite Metatome enthält das zweite Element jeder Sequenz; die Reihenfolge wird weitergeleitet. In Python 3 gibt zip() einen Iterator zurück, nicht eine Liste.

Notes Python 2 Python 3
zip(a, b, c) list(zip(a, b, c))
d.join(zip(a, b, c)) no change

In der einfachsten Form können Sie die Funktion vor der Funktion von zip () wiederherstellen, indem Sie die zurückgegebene Funktion von der Funktion von list () aufrufen, die die Funktion von zip () einpackt. Die Funktion von list () durchläuft den Iterator, in dem die Funktion von zip () zurückgegeben wird, und gibt dann die Liste der zurückgegebenen Ergebnisse an. In einer Kontextumgebung, die bereits alle Elemente der Sequenz durchläuft (z. B. wenn die Join () -Methode aufgerufen wird), funktioniert die zip () -Rückgabe der Iteratoren normalerweise. Die 2to3-Skripte werden diese Situationen erkennen, ohne Änderungen an Ihrem Code vorzunehmen.

  • #### StandardError-Ausnahme

In Python 2 ist StandardError die Basisklasse für alle anderen eingebauten Ausnahmen außer StopIteration, GeneratorExit, KeyboardInterrupt und SystemExit. In Python 3 wurde StandardError abgeschafft und mit Exception ersetzt.

Notes Python 2 Python 3
x =StandardError() x =Exception()
x =StandardError(a, b, c) x =Exception(a, b, c)
  • #### Konstante im Types-Modul

In Python 2 enthält es die Konstanten, die alle grundlegenden Datentypen darstellen, wie z. B. dict und int. In Python 3 wurden diese Konstanten abgeschafft. Sie müssen nur durch die Namen der grundlegenden Datentypen ersetzt werden.

Notes Python 2 Python 3
types.UnicodeType str
types.StringType bytes
types.DictType dict
types.IntType int
types.LongType int
types.ListType list
types.NoneType type(None)
types.BooleanType bool
types.BufferType memoryview
types.ClassType type
types.ComplexType complex
types.EllipsisType type(Ellipsis)
types.FloatType float
types.ObjectType object
types.NotImplementedType type(NotImplemented)
types.SliceType slice
types.TupleType tuple
types.TypeType type
types.XRangeType range

types.StringType wird als Byte und nicht als Str abgebildet, da in Python 2 a sequence of bytes in Wirklichkeit nur eine Reihe von Bytes ist, die mit einem bestimmten Zeichen codiert sind.

  • #### Globale Instanz der Funktion

isinstance() ist eine Funktion, die prüft, ob ein Objekt ein Instanz einer bestimmten Klasse oder eines bestimmten Typs ist. In Python 2 können Sie eine Instanz mit den Typen () an eine Instanz () übergeben, und wenn das Objekt eines beliebigen Typs in der Instanz ist, wird die Funktion True () zurückgegeben. In Python 3 können Sie dies immer noch tun, aber es wird nicht empfohlen, einen Typ zweimal als Parameter zu übergeben.

Notes Python 2 Python 3
isinstance(x,(int,float,int)) isinstance(x,(int,float))
  • #### Basestring-Datentyp

In Python 2 gibt es zwei Stringtypen: Unicode-Code-String und Nicht-Unicode-Code-String. Es gibt aber auch einen anderen Typ, den Basestring. Es ist ein abstrakter Datentyp, der die Überklasse der Str und Unicode-Typen ist.

Notes Python 2 Python 3
isinstance(x, basestring) isinstance(x, str)
  • #### Itertools-Modul

In Python 2.3 wurde das Itertools Modul eingeführt, das die Varianten der globalen Funktionen zip (), map (), filter (), die als Typ und nicht als Liste zurückgegeben werden, definiert. In Python 3 wurden diese Variantenfunktionen in den Itertools abgeschafft, da der Typ der globalen Funktionen als Iteratoren zurückgegeben wurde.

Notes Python 2 Python 3
itertools.izip(a, b) zip(a, b)
itertools.imap(a, b) map(a, b)
itertools.ifilter(a, b) filter(a, b)
from itertools import imap, izip, foo from itertools import foo
  1. Verwenden Sie die globale zip () -Funktion, anstatt itertools.izip () -Funktion.
  2. Verwenden Sie map () statt itertools.imap () 3 ,itertools.ifilter ((() wird zu filter ((() 。
  3. Das Itertools-Modul existiert in Python 3, es enthält nur keine Funktionen mehr, die in den globalen Namensraum übertragen wurden. Die 2to3-Skripte sind intelligent genug, um die nicht mehr nützlichen Eingabesätze zu entfernen, während die Integrität anderer Eingabesätze erhalten wird.
  • #### sys.exc_type, sys.exc_value, sys.exc_traceback

Bei der Ausnahmebehandlung gibt es drei Variablen, die Sie im sys-Modul aufrufen können: sys.exc_type, sys.exc_value, sys.exc_traceback. In der Tat gab es diese bereits in der Zeit von Python 1. Ab Python 1.5 wird es nicht mehr empfohlen, diese drei Variablen zu verwenden, da sys.exc_info neu ist, eine Metamethode, die alle drei Elemente enthält. In Python 3 existieren diese drei Variablen schließlich nicht mehr; das bedeutet, dass Sie sys.exc_info verwenden müssen.

Notes Python 2 Python 3
sys.exc_type sys.exc_info()[0]
sys.exc_value sys.exc_info()[1]
sys.exc_traceback sys.exc_info()[2]
  • #### Auflisten der Parameter

In Python 2 müssen Sie keine Klammern um die Algorithmuswerte hinzufügen, wenn Sie eine Listenauflösung für eine überlaufende Algorithmusgruppe schreiben müssen. In Python 3 sind diese Klammern notwendig.

Notes Python 2 Python 3
[i for iin 1,2] [i for iin(1,2)]
  • #### Die Funktion os.getcwdu

In Python 2 gibt es eine Funktion namens os.getcwd(), die den aktuellen Arbeitsverzeichnis als eine nicht-Unicode-Code-String zurückgibt. Da moderne Dateisystemen mit hexacharaktercode-fähigen Verzeichnisnamen umgehen können, wurde in Python 2.3 die Funktion os.getcwdu() eingeführt. Die Funktion gibt die Unicode-Code-String des aktuellen Arbeitsverzeichnisses zurück.

Notes Python 2 Python 3
os.getcwdu() os.getcwd()
  • #### Meta-Klassen

In Python 2 können Sie Metaclass-Parameter definieren, indem Sie sie in einer Klassenaussage definieren, oder Sie definieren eine spezielle Klassenebene (class-level).metaclass Attribut, um eine Subklasse zu erstellen.__metaclass_Das Attribut _ wurde gelöscht.

Notes Python 2 Python 3
class C(metaclass=PapayaMeta):
  pass
unchanged
class Whip:
  _metaclass_ = PapayaMeta
class Whip(metaclass=PapayaMeta):
  pass
class C(Whipper, Beater):
  _metaclass_ = PapayaMeta
class C(Whipper,Beater,metaclass=PapayaMeta):
  pass
  1. Die Metaclass-Parameter bei der Klassendeklaration deklarieren, was sowohl in Python 2 als auch in Python 3 gilt.
  2. Die metaclass-Eigenschaft wird in der Definition der Klasse in Python 2 verwendet, aber nicht mehr in Python 3.
  3. 2to3 kann eine gültige Klassenanweisung erstellen, auch wenn die Klasse von mehreren Elternklassen geerbt wird.
  • #### Über den Code-Stil

Die folgenden Fixes sind keine echten Fixes. Das heißt, sie sind nur stilistisch und nicht von der Natur des Codes. Die Entwickler von Python haben jedoch ein großes Interesse daran, dass der Code-Stil so einheitlich wie möglich ist.

  • #### set (wörtlich) literal (wörtlich)

In Python 2 ist die einzige Methode, um eine Literal-Wert-Sammlung zu definieren, set (a_sequence) aufzurufen. In Python 3 funktioniert das immer noch, aber die neue Kennzeichnung ((literal notation): Großklammer (({}) ist eine klarere Methode. Diese Methode funktioniert auch außerhalb der Leerzeichen, da die Wörterbücher auch mit Großklammern bezeichnen, so dass {} ein leeres Wörterbuch anstelle einer Leerzeichen darstellt.

2to3-Skripte korrigieren standardmäßig keine set() -Wortwerte. Um diese Funktion zu aktivieren, wird der Parameter -f set_literal beim Aufruf der Befehlszeile 2to3 angegeben.

Notes Before After
set([1,2,3]) {1,2,3}
set((1,2,3)) {1,2,3}
set([i for iin a_sequence]) {i for iin a_sequence}
  • #### Globale Funktions-Buffer

Python-Objekte, die in C implementiert sind, können eine Buffer-Interface ausführen, die es anderen Python-Codes erlaubt, direkt ein Stück Speicher zu lesen und zu schreiben. Das klingt großartig, aber es ist auch schrecklich. In Python 3 wurde Buffer umbenannt in memoryview. Die tatsächlichen Änderungen sind komplexer, aber Sie können diese Unterschiede fast ignorieren.

2to3 schreibt standardmäßig keine Buffer () -Funktion. Um diese Funktion zu aktivieren, wird die -f-Buffer-Parameter auf der Befehlszeile aufgerufen.

Notes Before After
x =buffer(y) x =memoryview(y)
  • #### Raum um das Komma (express)

Obwohl Python sehr strenge Anforderungen an die Leerzeichen für das Ein- und Ausdentieren (indenting and outdenting) hat, ist Python sehr frei in Bezug auf die Verwendung von Leerzeichen in anderen Bereichen. In Listen, Bausteinen, Samml