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.
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 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) |
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.
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) |
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.
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: |
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) |
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 |
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.
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
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()) |
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 |
Notes | Python 2 | Python 3 |
---|---|---|
① | import xmlrpclib | import xmlrpc.client |
② | import DocXMLRPCServer import SimpleXMLRPCServer |
import xmlrpc.server |
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 |
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 |
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.
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 |
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 |
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) |
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) |
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) |
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.
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’)) |
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.x
In 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)) |
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 |
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 |
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 |
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 |
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()) |
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.
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) |
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 |
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_ |
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.
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 |
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) |
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_’) |
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.
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) |
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.
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)) |
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) |
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 |
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] |
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)] |
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() |
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 |
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.
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} |
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) |
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