Type/to search
8
Follow
1370
Followers
Änderungen zwischen Python 2.x.x und Python 3.x.x und So konvertieren Sie Python 2.x.x in Python 3.x.x
Tutorials
Created 2016-10-09 12:36:49  Updated 2017-10-11 10:18:05
 2
 5674

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.

NotesPython 2Python 3
printprint()
print 1print(1)
print 1,2print(1,2)
print 1,2,print(1,2,end=' ')
print >>sys.stderr,1,2,3print(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

NotesPython 2Python 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.)

NotesPython 2Python 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.

NotesPython 2Python 3
x = 1000000000000Lx = 1000000000000
x = 0xFFFFFFFFFFFFLx = 0xFFFFFFFFFFFF
long(x)int(x)
type(x) is longtype(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 <>.

NotesPython 2Python 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) <unk> Python 3 unterstützt diese Methode nicht mehr <unk> Sie müsseninOperator

NotesPython 2Python 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.

NotesPython 2Python 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.
NotesPython 2Python 3
import httplibimport http.client
import Cookieimport http.cookies
import cookielibimport http.cookiejar
import BaseHTTPServer <br> import SimpleHTTPServer <br> import CGIHttpServerimport 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.
NotesPython 2Python 3
import urllibimport urllib.request <br> urllib.parse,urllib.error
import urllib2import urllib.request <br> urllib.error
import urlparseimport urllib.parse
import robotparserimport urllib.robotparser
from urllib import FancyURLopener <br> from urllib import urlencodefrom urllib.request import FancyURLopener <br> from urllib.parse import urlencode
from urllib2 import Request <br> from urllib2 import HTTPErrorfrom urllib.request import Request <br> 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 (<unk>) 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.

NotesPython 2Python 3
import urllib print urllib.urlopen('http://diveintopython3.org/').read()import urllib.request, urllib.parse, urllib.error <br> 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.
NotesPython 2Python 3
import dbmimport dbm.ndbm
import gdbmimport dbm.gnu
import dbhashimport dbm.bsd
import dumbdbmimport dbm.dumb
import anydbm <br> import whichdbimport 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.
NotesPython 2Python 3
import xmlrpclibimport xmlrpc.client
import DocXMLRPCServer <br> import SimpleXMLRPCServerimport xmlrpc.server
  • Weitere Module

NotesPython 2Python 3
try:<br>  import cStringIO as StringIO <br>except ImportError: <br>  import StringIOimport io
try:<br>  import cPickle as pickle <br>except ImportError: <br>  import pickleimport pickle
import _builtin_import builtins
import copy_regimport copyreg
import Queueimport queue
import SocketServerimport socketserver
import ConfigParserimport configparser
import reprimport reprlib
import commandsimport 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?

NotesPython 2Python 3
import constantsfrom .import constants
from mbcharsetprober import MultiByteCharSetProberfrom .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.

NotesPython 2Python 3
anIterator.next()next(anIterator)
a_function_that_returns_an_iterator().next()next(a_function_that_returns_an_iterator())
class A:<br>  def next(self):<br>  passclass A:<br>  def next(self):<br>  pass|
class A:<br>  def next(self, x, y):<br>  passno change
next = 42<br>for an_iterator in a_sequence_of_iterators:<br>  an_iterator.next()next = 42<br>for an_iterator in a_sequence_of_iterators:<br>  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.

NotesPython 2Python 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.

NotesPython 2Python 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.

NotesPython 2Python 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.

NotesPython 2Python 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.

NotesPython 2Python 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.

NotesPython 2Python 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.

NotesPython 2Python 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.

NotesPython 2Python 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.

NotesPython 2Python 3
try:<br>  import mymodule<br>except ImportError, e<br>  passtry:<br>  import mymodule<br>except ImportError as e:<br>  pass
try:<br>  import mymodule<br>except (RuntimeError, ImportError), e<br>  passtry:<br>  import mymodule<br>except (RuntimeError, ImportError) as e:<br>  pass
try:<br>  import mymodule<br>except ImportError:<br>  passno change
try:<br>  import mymodule<br>except:<br>  passno 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.

NotesPython 2Python 3
raise MyExceptionunchanged
raise MyException,'error message'raise MyException('error message')
raise MyException,'error message', a_tracebackraise 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.

NotesPython 2Python 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.

NotesPython 2Python 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 ().

NotesPython 2Python 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.

NotesPython 2Python 3
a_function.func_namea_function._name_
a_function.func_doca_function._doc_
a_function.func_defaultsa_function._defaults_
a_function.func_dicta_function._dict_
a_function.func_closurea_function._closure_
a_function.func_globalsa_function._globals_
a_function.func_codea_function._code_

1、__name_Die _attribute ((originalfunc_name) enthält den Namen der Funktion。
2、__doc__attribute ((originalfuncdoc) enthält die Dokumentstring, die Sie im Quellcode der Funktion definiert haben ((docstring))
3、__defaults__attribute ((originalfunc_defaults) ist eine Array, die die Default-Werte der Parameter speichert.
4、__dict__attribute ((originalfunc_dict) ist ein Namensraum, der die Eigenschaften einer beliebigen Funktion unterstützt.
5、__closure__attribute ((originalfunc_closure) ist eine Subgruppe aus Cell-Objekten, die die Bindung einer Funktion an eine freie Variable ((free variable)) enthält.
6、__globals__attribute ((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.

NotesPython 2Python 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.

NotesPython 2Python 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+ zlambda x_y_z: x_y_z[0]+x_y_z[1][0]+ x_y_z[1][1]
lambda x, y, z: x+y + zunchanged
  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.

NotesPython 2Python 3
aClassInstance.aClassMethod.im_funcaClassInstance.aClassMethod._func_
aClassInstance.aClassMethod.im_selfaClassInstance.aClassMethod._self_
aClassInstance.aClassMethod.im_classaClassInstance.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 wird__bool__()。

NotesPython 2Python 3

|①|class A:<br>  def nonzero(self):<br>  pass|class A:<br>  def bool(self):<br>  pass
|②|class A:<br>  def nonzero(self, x, y):<br>  pass|no change|

  1. Python 3 ruft, wenn ein Klassenobjekt im Bure-Kontext verwendet wird__bool_Das ist eine sehr schwierige Aufgabe.nonzero()。
  2. Wenn Sie jedoch eine Definition haben, die zwei Parameter verwendet__nonzero__() 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.

NotesPython 2Python 3
x = 0755x = 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.

NotesPython 2Python 3
from sys importmaxintfrom sys importmaxsize
a_function(sys.maxint)a_function(sys.maxsize)
  1. maxint wird zu maxsize.
  2. Alle sys.maxint werden zu sys.maxsize <unk>
  • 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 ______.

NotesPython 2Python 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.

NotesPython 2Python 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.

NotesPython 2Python 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.

NotesPython 2Python 3
types.UnicodeTypestr
types.StringTypebytes
types.DictTypedict
types.IntTypeint
types.LongTypeint
types.ListTypelist
types.NoneTypetype(None)
types.BooleanTypebool
types.BufferTypememoryview
types.ClassTypetype
types.ComplexTypecomplex
types.EllipsisTypetype(Ellipsis)
types.FloatTypefloat
types.ObjectTypeobject
types.NotImplementedTypetype(NotImplemented)
types.SliceTypeslice
types.TupleTypetuple
types.TypeTypetype
types.XRangeTyperange

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.

NotesPython 2Python 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.

NotesPython 2Python 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.

NotesPython 2Python 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, foofrom 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.

NotesPython 2Python 3
sys.exc_typesys.exc_info()[0]
sys.exc_valuesys.exc_info()[1]
sys.exc_tracebacksys.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.

NotesPython 2Python 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.

NotesPython 2Python 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.

NotesPython 2Python 3
class C(metaclass=PapayaMeta):<br>  passunchanged
class Whip:<br>  _metaclass_ = PapayaMetaclass Whip(metaclass=PapayaMeta):<br>  pass
class C(Whipper, Beater):<br>  _metaclass_ = PapayaMetaclass C(Whipper,Beater,metaclass=PapayaMeta):<br>  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.

NotesBeforeAfter
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.

NotesBeforeAfter
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, Sammlungen und Wörterbüchern können Leerzeichen vor oder hinter Kommas erscheinen, was keinen schlechten Effekt hat.

2to3-Skripte korrigieren standardmäßig keine Leerzeichen um die Kommas. Um diese Funktion zu aktivieren, wird der -f wscomma-Parameter beim Aufruf von 2to3 auf der Befehlszeile angegeben.

NotesBeforeAfter
a ,ba, b
{a :b}{a: b}
  • Übliche Idiome

    In der Python-Community sind viele Regeln etabliert. Einige davon, wie beispielsweise die while 1:-Loop, gehen auf Python 1 zurück. Python hatte bis zu Python 2.3 keine echten Boolean-Typen, so dass die Entwickler früher 1 und 0-Ersatz verwendet haben.

2to3-Skripte machen keine Reparaturen für diese Praktiken. Um diese Funktion zu aktivieren, geben Sie den Parameter -f idioms an, wenn Sie 2to3 auf der Befehlszeile aufrufen.

NotesBeforeAfter
while 1:<br>  do_stuff()while True:<br>  do_stuff()
type(x) == Tisinstance(x, T)
type(x) is Tisinstance(x, T)
a_list = list(a_sequence)a_list = sorted(a_sequence)
a_list.sort()do_stuff(a_list)
do_stuff(a_list)

Übertragung vonCSDN Blog

Wie man Python2-Code in Python3-Code umwandelt

Wie man Python 2.x-Code in Python 3.x umwandelt.
Wie man Python 2.x-Code in Python 3.x-Code umwandelt

  • 1. Die manuelle Umstellung selbst

Das ist nicht viel zu sagen, wenn es sich nur um wenige Funktionen handelt, wie z.B. print und so weiter.

Das ist eine sehr schwierige Aufgabe, aber es ist eine sehr wichtige Aufgabe.

  • 2. Verwenden Sie die in Python integrierten (Python-Skript-) Tools, um die Umwandlung automatisch zu erledigen

Python 2.x-Versionen, wie z.B. Python 2.7.2, die ich installiert habe, bringen einige nützliche Tools mit, nachdem sie von Windows heruntergeladen und installiert wurden.

Einer davon, der 2to3.py genannt wird, hilft Ihnen dabei, Python 2.x-Code in Python 3.x umzusetzen.

Sie befindet sich in der Root-Verzeichnis der Python-Installationen von \Python27\Tools\Scripts\2to3.py

Wie man 2to3.py nutzt, um Python 2.x-Code in Python 3.x umzuwandeln
Ich habe zum Beispiel ein Python-Skript für Python 2.x:

D:\tmp\tmp_dev_root\python\python2_to_python3\34563264_data_from_site.py

Nun, der Code, der es in Python 3.x umwandeln will.

Sie können das Skript, das Sie konvertieren möchten, anzeigen, indem Sie cmd in Windows öffnen und ausführen

D:\tmp\WordPress\DevRoot\Python27\Tools\Scripts\2to3.py -w 34563264_data_from_site.py

Das ist eine erfolgreiche Umwandlung mit folgenden Ergebnissen:

D:\tmp\tmp_dev_root\python\python2_to_python3>D:\tmp\WordPress\DevRoot\Python27\Tools\Scripts\2to3.py -w 34563264_data_from_site.py RefactoringTool: Skipping implicit fixer: buffer RefactoringTool: Skipping implicit fixer: idioms RefactoringTool: Skipping implicit fixer: set_literal RefactoringTool: Skipping implicit fixer: ws_comma RefactoringTool: Refactored 34563264_data_from_site.py --- 34563264_data_from_site.py (original) +++ 34563264_data_from_site.py (refactored) @@ -18,7 +18,7 @@ import time; import codecs; import logging; -import urllib; +import urllib.request, urllib.parse, urllib.error; from datetime import datetime,timedelta; from optparse import OptionParser; from string import Template,replace; @@ -90,7 +90,7 @@ foundPhone = eachItemSoup.find(attrs={"class":"phone"}); logging.debug("foundPhone=%s", foundPhone); if(foundPhone): - foundPhoneUni = unicode(foundPhone); + foundPhoneUni = str(foundPhone); logging.debug("foundPhoneUni=%s", foundPhoneUni); # case 1: #<p class="phone"><strong>phone:</strong>&nbsp;800.206.7886<br /> @@ -122,7 +122,7 @@ foundWeb = eachItemSoup.find(attrs={"class":"web"}); logging.debug("foundWeb=%s", foundWeb); if(foundWeb): - foundWebUni = unicode(foundWeb); + foundWebUni = str(foundWeb); logging.debug("foundWebUni=%s", foundWebUni); # <p class="web"><strong>e-mail:</strong>&nbsp;<a href="#">[email protected]</a><br /> @@ -151,7 +151,7 @@ foundAddr = eachItemSoup.find(attrs={"class":"addr"}); logging.debug("foundAddr=%s", foundAddr); if(foundAddr): - foundAddrUni = unicode(foundAddr); + foundAddrUni = str(foundAddr); # <p class="addr"> # <strong>address:</strong>&nbsp;740 SW 21st Ave, Suite #310<br /> RefactoringTool: Files that were modified: RefactoringTool: 34563264_data_from_site.py

Wie Sie sehen können, wurde der ursprüngliche 34563264_data_from_site.py zu Python 3.x-Code.

Es gibt auch noch eine Bak-Datei::34563264_data_from_site.py.bak, vergleichen Sie die beiden und sehen Sie den Unterschied:

img

Derzeit gibt es noch weitere Möglichkeiten, 2to3.py selbst in der Hilfe zu finden:

D:\tmp\tmp_dev_root\python\python2_to_python3>D:\tmp\WordPress\DevRoot\Python27\Tools\Scripts\2to3.py -h Usage: 2to3 [options] file|dir ... Options: -h, --help show this help message and exit -d, --doctests_only Fix up doctests only -f FIX, --fix=FIX Each FIX specifies a transformation; default: all -j PROCESSES, --processes=PROCESSES Run 2to3 concurrently -x NOFIX, --nofix=NOFIX Prevent a transformation from being run -l, --list-fixes List available transformations -p, --print-function Modify the grammar so that print() is a function -v, --verbose More verbose logging --no-diffs Don't show diffs of the refactoring -w, --write Write back modified files -n, --nobackups Don't write backups for modified files

Hier sind nur ein paar Erklärungen:

(1) Wenn der oben genannte Parameter ohne -w verwendet wird, wird standardmäßig nur der Diff-Inhalt, der dem Umwandlungsprozess entspricht, in das aktuelle Fenster gedruckt.

(2) Hinzufügen von -w bedeutet, dass die geänderten Inhalte in die ursprüngliche Datei zurückgeschrieben werden.

(3) Wenn Sie keine Bak-Dateien erzeugen möchten, können Sie -n hinzufügen.

(4) Wenn man nicht die ganze Menge an Ausgabe sehen will, dann mit No-Diffs.

Die anderen sind nicht besonders präsent. Interessierte können selbst weitermachen.

Die Verwendung von 2to3 oben wurde übertragen vonAuf dem Weg

Das ist eine Überarbeitung, wenn Sie etwas falsch gemacht haben, dann weisen Sie es uns bitte an!_^

Related Recommendations
Comment
All comments (2)

    botvs用的python2?

    9 years ago

    BotVS 的回测服务器 使用的是Python 2.7版本, 对于BotVS 平台 Python2 ,Python3 都是支持的。

    9 years ago
  • 1
Forums
PINE Language
Get the app
iPhone Download
© 2015 - ∞ INVENTOR PTE LTD (SG)