Hampir semua program Python 2 memerlukan beberapa perubahan untuk berfungsi dengan baik di dalam persekitaran Python 3. Untuk memudahkan proses penukaran, Python 3 mempunyai skrip utiliti sendiri yang dipanggil 2to3 (Utility Script), yang mengambil fail sumber program Python 2 anda sebagai input dan kemudian secara automatik mengubahnya ke dalam bentuk Python 3. Kajian kes: memindahkan chardet ke Python 3 (porting chardet to Python 3) menggambarkan bagaimana skrip ini berfungsi, dan kemudian menunjukkan beberapa keadaan di mana ia tidak dapat diperbaiki secara automatik.
Dalam Python 2, print adalah satu pernyataan. Apa sahaja yang anda mahu output, anda boleh meletakkan ia di belakang kata kunci print. Dalam Python 3, print () adalah fungsi. Seperti fungsi lain, print () memerlukan anda untuk menyampaikan apa yang anda mahu output sebagai 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) |
Python 2 mempunyai dua jenis rentetan:Senar UnicodedanSenar bukan UnicodePython 3 hanya mempunyai satu jenis:Senar Unicode。
Notes | Python 2 | Python 3 |
---|---|---|
① | u’PapayaWhip’ | ‘PapayaWhip’ |
② | ur’PapayaWhip\foo’ | r’PapayaWhip\foo’ |
Senar Unicode dalam Python 2 adalah senar biasa dalam Python 3, kerana senar dalam Python 3 sentiasa dalam bentuk Unicode 。 Senar Unicode Asli ((raw string)) ((Python tidak akan menterjemahkan garisan terbalik secara automatik menggunakan senar ini “”) juga digantikan dengan senar biasa, kerana dalam Python 3, semua senar asal dikodkan dalam Unicode .
Python 2 mempunyai dua fungsi global yang boleh memaksa objek untuk ditukar menjadi senar: unicode ((() untuk menukar objek menjadi senar Unicode, dan str ((() untuk menukar objek menjadi senar bukan Unicode. Python 3 hanya mempunyai satu jenis senar, senar Unicode, jadi str ((() berfungsi untuk semua fungsi.Fungsi unicode ((() tidak lagi wujud dalam Python 3.)
Notes | Python 2 | Python 3 |
---|---|---|
① | unicode(anything) | str(anything) |
Python 2 mempunyai jenis int dan long yang disediakan untuk nombor bukan floating point. Maksimum jenis int tidak boleh melebihi sys.maxint, dan nilai maksimum ini adalah berkaitan dengan platform. Anda boleh menentukan integer panjang dengan melampirkan L di akhir nombor, yang jelas, ia lebih luas daripada jumlah yang ditunjukkan oleh jenis int.
Baca lebih lanjut: PEP 237: Kesatuan bentuk bulat dan bulat.
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) |
Integer panjang desimal dalam Python 2 telah digantikan dengan integer biasa dalam desimal dalam Python 3. Integer panjang enam belas digit dalam Python 2 digantikan dengan integer biasa enam belas digit dalam Python 3. Dalam Python 3, format panjang tidak lagi wujud.Tidak ada fungsi long ((() semula jadi. Untuk memaksa penukaran satu pembolehubah kepada bentuk bulat, fungsi int ((() boleh digunakan。 Memeriksa sama ada pembolehubah adalah integer, mendapatkan jenis datanya, dan membandingkannya dengan jenis int ((bukan long)). Anda juga boleh menggunakan fungsi insinstance ((() untuk memeriksa jenis data; untuk menekankan lagi, gunakan int, dan bukan long, untuk memeriksa jenis nombor bulat。
Python 2 menyokong <> sebagai sinonim dengan!=. Python 3 hanya menyokong!=, tidak lagi menyokong <>.
Notes | Python 2 | Python 3 |
---|---|---|
① | if x <> y: | if x != y: |
② | if x <> y<> z: | if x != y!= z: |
1 , buat perbandingan sederhana. 2. Perbandingan antara tiga nilai yang agak rumit.
Dalam Python 2, objek kamus mempunyai_key() kaedah untuk menguji apakah kamus mengandungi kekunci tertentu ((key) ➜ Python 3 tidak lagi menyokong kaedah ini ➜ anda perlu menggunakaninOperator
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) |
Dalam Python 2, banyak kaedah kelas kamus yang dikembalikan adalah senarai. Di antara kaedah yang paling biasa digunakan, terdapat kunci, item, dan nilai. Dalam Python 3, semua kaedah di atas dikembalikan kepada pandangan dinamik. Dalam beberapa konteks, perubahan ini tidak memberi kesan. Jika nilai yang dikembalikan dari kaedah tersebut dihantar segera ke fungsi lain, dan fungsi itu akan melalui keseluruhan urutan, maka nilai yang dikembalikan oleh kaedah di atas adalah senarai atau pandangan dan tidak akan menghasilkan apa-apa perbezaan. Dalam beberapa kes lain, perubahan ini sangat penting dalam Python 3.
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 |
Dari Python 2 ke Python 3, beberapa modul dalam standard curry telah dinamakan semula. Beberapa modul yang berkaitan antara satu sama lain juga telah digabungkan atau disusun semula untuk menjadikan hubungan ini lebih logik.
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 |
Modul http.client mewujudkan perpustakaan asas yang boleh digunakan untuk meminta sumber HTTP dan menguraikan tindak balas HTTP. Modul http.cookies menyediakan antara muka Python untuk mendapatkan kuki yang dihantar melalui header HTTP Set-Cookie Penyemak imbas yang popular akan menyimpan kuki dalam bentuk fail pada cakera, dan modul http.cookiejar boleh mengendalikan fail-fail tersebut. Modul http.server mewujudkan pelayan HTTP asas
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 |
Sebelum ini, modul urllib dalam Python 2 mempunyai pelbagai fungsi, termasuk urlopen () untuk mendapatkan data, dan juga berguna untuk membahagikan URL ke dalam komponen-komponennya iaitu fungsi splitype () dan splitost () dan splituser (). Dalam pakej urllib yang baru, fungsi-fungsi ini disusun dengan lebih logik. 2to3 akan mengubah panggilan fungsi ini untuk menyesuaikan dengan skim penamaan baru. Dalam Python 3, modul urllib2 yang terdahulu telah digabungkan ke dalam pakej urllib. Pada masa yang sama, pelbagai perkara kegemaran anda dalam urllib2 akan muncul secara berterusan dalam modul urllib Python 3, seperti build_Opener () kaedah, Request object, HTTPBasicAuthHandler dan friends。 Modul urllib.parse dalam Python 3 mengandungi semua fungsi parse urlparse dalam Python 2. Modul urllib.robotparse menguraikan fail robots.txt. Kelas FancyURLopener yang menangani pengalihan HTTP dan kod status lain masih berfungsi dalam modul urllib.request di Python 3. Fungsi △ urlencode △ telah dipindahkan ke urllib.parse. Objek permintaan masih sah dalam urllib.request, tetapi kekaburan seperti HTTPError telah dipindahkan ke urllib.error. Adakah saya menyebut bahawa 2to3 juga akan menulis semula panggilan fungsi anda? Sebagai contoh, jika anda mengimport modul urllib ke dalam kod Python 2 anda, dan memanggil fungsi urllib.urlopen ((() untuk mendapatkan data, 2to3 akan mengedit kata import dan panggilan fungsi pada masa yang sama.
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 |
Pakej adalah satu entiti yang terdiri daripada sekumpulan modul yang berkaitan. Dalam Python 2, anda akan menggunakan import foo atau from foo import Bar untuk membuat rujukan antara modul dalam pakej yang sama. Penerjemah Python 2 akan mencari foo.py di direktori semasa, dan kemudian mencari di laluan carian Python (sys.path).
Katakan anda mempunyai beberapa fail dalam satu direktori seperti berikut:
chardet/ | +–init.py | +–constants.py | +–mbcharsetprober.py | +–universaldetector.py
Sekarang andaikan universaldetector.py memerlukan import keseluruhan constants.py, dan juga memerlukan import satu kelas untuk mbcharsetprober.py. Bagaimana anda akan melakukannya?
Notes | Python 2 | Python 3 |
---|---|---|
① | import constants | from .import constants |
② | from mbcharsetprober import MultiByteCharSetProber | from .mbcharsetprober import MultiByteCharsetProber |
Apabila anda perlu mengimport keseluruhan modul dari tempat lain dalam pakej, gunakan sintaks baru dari .import. Dalam contoh ini, kedua-dua fail ini berada dalam direktori yang sama, jadi anda menggunakan satu kalimat. Anda juga boleh mengimport dari direktori induk (dari .. import anothermodule) atau dari subdirektori. 2. Untuk mengimport kelas atau fungsi tertentu dari modul lain ke ruang nama modul anda, tambahkan laluan relatif ke nama modul yang perlu diimport, dan hilangkan garis miring terakhir ((slash) Dalam contoh ini, mbcharsetprober.py dan universaldetector.py berada dalam direktori yang sama, jadi nama laluan relatif adalah satu tanda baca. Anda juga boleh mengimport dari direktori induk ((from .. import anothermodule) atau dari subdirektori
Dalam Python 2, iterator mempunyai kaedah next () untuk mengembalikan item seterusnya dalam urutan. Ini juga berlaku dalam Python 3, tetapi sekarang terdapat fungsi global baru next () yang menggunakan iterator sebagai argumen.
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, contoh paling mudah, anda tidak lagi memanggil kaedah next (() iterator, dan anda kini menghantar iterator itu sendiri sebagai parameter kepada fungsi global next (() }}.
2. Jika anda mempunyai nilai yang dikembalikan sebagai fungsi iterator, panggil fungsi ini dan serahkan hasilnya sebagai parameter kepada fungsi next ((((skrip 2to3 cukup pintar untuk melakukan penukaran ini dengan betul.
3. Jika anda ingin mendefinisikan kelas anda sendiri dan menggunakannya sebagai iterator, dalam Python 3, anda boleh menggunakan kaedah khusus dengan mendefinisikannext() untuk mencapai.
4. Jika kelas yang anda tentukan mempunyai next () dan ia menggunakan satu atau lebih parameter, ia tidak akan bergerak semasa pelaksanaan 2 hingga 3. Kelas ini tidak boleh digunakan sebagai iterator, kerana kaedah next () mempunyai parameter.
5. Ini agak rumit. Jika anda kebetulan mempunyai pembolehubah tempatan yang dipanggil next, ia akan mendapat keutamaan lebih tinggi dalam Python 3 daripada fungsi global next ((() }}. Dalam kes ini, anda perlu memanggil kaedah khas iterator.next() untuk mendapatkan elemen seterusnya dalam urutan。(atau, anda juga boleh menyusun semula kod supaya nama pembolehubah tempatan tidak dipanggil next, tetapi 2to3 tidak akan melakukan ini untuk anda。)
Dalam Python 2, kaedah filter() mengembalikan senarai yang diperolehi dengan fungsi yang mengembalikan nilai True atau False untuk memeriksa setiap elemen dalam urutan. Dalam Python 3, fungsi filter() mengembalikan iterator, bukan lagi senarai.
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 |
Dalam kes yang paling mudah, 2to3 akan menggunakan fungsi list () untuk membungkus filter () dan fungsi list () akan melalui parameternya dan mengembalikan senarai. 2 , Walau bagaimanapun, jika filter() panggilan telah di bungkus oleh list(), 2to3 tidak akan memprosesnya lagi, kerana dalam kes ini tidak penting sama ada nilai yang dikembalikan oleh filter() adalah iterator. 3 , Untuk menangani sintaks khusus filter ((None, …) 2 to 3 akan menukar panggilan ini dari setara sintaks ke dalam analisis senarai. 4. Oleh kerana kitaran for akan melalui keseluruhan urutan, tidak perlu mengubahsuai lagi. 5. Sama seperti di atas, tidak perlu dilakukan perubahan, kerana analisis senarai akan melalui keseluruhan urutan, walaupun filter ((() mengembalikan sebuah iterator, ia masih boleh berfungsi seperti filter ((() yang sebelumnya mengembalikan senarai.
Seperti perubahan pada filter, fungsi map kini mengembalikan sebuah iterator. Dalam Python 2, ia mengembalikan sebuah senarai.
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 , sama dengan penanganan filter ((), dalam kes yang paling mudah, 2to3 akan menggunakan fungsi list (() untuk membungkus panggilan map ((). 2. Untuk sintaks map ((None, …), seperti filter ((None, …), 2to3 akan mengubahnya menjadi panggilan setara yang menggunakan list ((). 3, jika parameter pertama map () adalah fungsi lambda, 2to3 akan menukarnya secara ekuivalen ke dalam analisis senarai. 4. Tidak perlu melakukan perubahan untuk kitaran for yang akan melalui keseluruhan urutan. 5. Sekali lagi, tidak perlu melakukan perubahan di sini, kerana analisis senarai akan melalui keseluruhan urutan, walaupun nilai pulangan map () adalah iterator dan bukan senarai, ia akan berfungsi dengan baik.
Dalam Python 3, fungsi reduce ((() telah dikeluarkan dari ruang nama global dan kini diletakkan di dalam modul fucntools。
Notes | Python 2 | Python 3 |
---|---|---|
① | reduce(a, b, c) | from functools import reduce reduce(a, b, c) |
Python 2 mempunyai fungsi global yang dipanggil apply (), yang menggunakan fungsi f dan senarai.[a, b, c] sebagai argumen, nilai yang dikembalikan ialah f ((a, b, c) . Anda juga boleh memanggil fungsi ini secara langsung dengan menambahkan tanda bintang (((*Dalam Python 3, fungsi apply ((() tidak lagi wujud; tanda bintang mesti digunakan.
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 , bentuk yang paling mudah, boleh melalui dalam senarai parameter ((seperti[a, b, c]) sebelum menambah tanda bintang untuk memanggil fungsi ≠. Ini sama dengan fungsi apply ((() dalam Python 2. 2 In Python 2, apply() fungsi sebenarnya boleh membawa 3 argumen: satu fungsi, satu senarai argumen, dan satu argumen penamaan kamus. Dalam Python 3, anda boleh dengan menambah tanda bintang sebelum senarai argumen), tambah dua tanda bintang di hadapan argumen penamaan kamus ((**Ia juga boleh digunakan untuk tujuan yang sama. 3. Operator + digunakan di sini sebagai fungsi untuk menyambungkan senarai, ia mempunyai keutamaan yang lebih tinggi daripada operator, jadi tidak perlu menambah tanda kurung tambahan di sekitar a_list_of_args + z. Skrip 2 ke 3 cukup pintar untuk menukar panggilan apply () yang rumit, termasuk fungsi yang dipanggil dalam modul import.
Dalam Python 2, anda boleh menggunakan fungsi intern () untuk membatasi () fungsi intern () pada satu senar untuk mencapai pengoptimuman prestasi. Dalam Python 3, fungsi intern () telah dipindahkan ke modul sys.
Notes | Python 2 | Python 3 |
---|---|---|
① | intern(aString) | sys.intern(aString) |
Sama seperti pernyataan print menjadi fungsi dalam Python 3, pernyataan exec adalah sedemikian. Fungsi。exec() menggunakan string yang mengandungi kod Python yang dipilih sebagai parameter, dan kemudian mengeksekusinya seperti menjalankan pernyataan atau ungkapan.。exec() adalah serupa dengan eval(), tetapi exec() lebih kuat dan lebih mahir.。eval() fungsi hanya dapat melaksanakan satu ungkapan tunggal, tetapi exec() dapat menjalankan beberapa pernyataan, import, dan pengisytiharan fungsi.
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, dalam bentuk yang paling mudah, kerana exec (() kini merupakan fungsi dan bukan pernyataan, 2to3 akan mengelilingi kod dalam bentuk senar ini dengan tanda kurung. 2. Perkataan exec dalam Python 2 boleh menentukan ruang nama, dan kod akan dijalankan dalam ruang peribadi yang terdiri daripada objek global. Python 3 juga mempunyai fungsi seperti itu; anda hanya perlu menyampaikan ruang nama ini sebagai parameter kedua kepada fungsi exec (). 3. Lebih ajaibnya lagi, pernyataan exec di Python 2 juga boleh menentukan ruang nama tempatan (seperti pembolehubah yang diisytiharkan dalam fungsi). Di Python 3, fungsi exec () juga mempunyai fungsi seperti itu.
Seperti kata-kata exec sebelumnya, kata-kata execfile dalam Python 2 juga boleh menggunakan string seperti menjalankan kod Python. Perbezaan antara exec menggunakan string, sedangkan execfile menggunakan file. Dalam Python 3, kata-kata execfile telah dihapuskan. Jika anda benar-benar ingin menjalankan kod Python dalam satu fail tetapi anda tidak mahu mengimpornya, anda boleh membacanya dengan membuka fail itu, membaca isinya, dan memanggil fungsi compile () untuk memaksa Python interpreter untuk mengkompilasi kod, dan memanggil fungsi exec () yang baru.
Notes | Python 2 | Python 3 |
---|---|---|
① | execfile(‘a_filename’) | exec(compile(open(‘a_filename’).read(),‘a_filename’,‘exec’)) |
Dalam Python 2, untuk mendapatkan string yang mewakili objek arbitrer, ada cara untuk membungkus objek dalam tanda petik ((sepertix
Dalam Python 3, keupayaan ini masih wujud, tetapi anda tidak boleh lagi menggunakan tanda petik untuk mendapatkan rentetan ini. Anda perlu menggunakan fungsi global repr ((() }}.
Notes | Python 2 | Python 3 |
---|---|---|
① | `x` | repr(x) |
② | `‘PapayaWhip’ + `2`` | repr(‘PapayaWhip’+ repr(2)) |
Dari Python 2 ke Python 3, sintaks untuk menangkap kecacatan sedikit berubah.
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 menggunakan kata kunci baru, as。 berbanding dengan Python 2 yang menambahkan koma selepas jenis pengecualian. 2. Kata kunci as juga boleh digunakan untuk menangkap pelbagai jenis keabnormalan dalam satu masa. 3. Jika anda menangkap satu pengecualian, tetapi anda tidak mahu mengakses objek pengecualian itu sendiri, Python 2 dan Python 3 mempunyai sintaks yang sama. 4 , Begitu juga, jika anda menggunakan kaedah perlindungan ((fallback) untuk menangkap semua pengecualian, sintaks Python 2 dan Python 3 adalah sama. 5. Apabila mengimport modul (atau dalam kebanyakan kes lain), anda tidak boleh menggunakan kaedah ini (lihat fallback di atas). Jika tidak, program mungkin akan menangkap kecacatan seperti KeyboardInterrupt (jika pengguna mengganggu program dengan menekan Ctrl-C), yang akan membuat debug menjadi lebih sukar.
Dalam Python 3, terdapat sedikit perubahan dalam sintaks untuk mengeluarkan pengecualian tersuai.
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 |
Dalam Python 2, penjana mempunyai kaedah “throw”). Perkataan a_generator.throw () akan mengeluarkan pengecualian apabila penjana ditangguhkan, dan kemudian mengembalikan nilai seterusnya yang diambil oleh fungsi penjana. Dalam Python 3, fungsi ini masih tersedia, tetapi sedikit berbeza dalam sintaksis.
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 |
Dalam Python 2, terdapat dua cara untuk mendapatkan nombor dalam julat tertentu: range (((), yang mengembalikan senarai, dan range (((), yang mengembalikan iterator. Dalam Python 3, range ((() mengembalikan iterator, dan xrange ((() tidak lagi wujud.
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 |
Dalam kes yang paling mudah, 2to3 akan menukar xrange () menjadi range () 2 , Jika kod Python 2 anda menggunakan range (), 2to3 tidak tahu sama ada anda memerlukan senarai atau sama ada iterator berfungsi. Sebagai langkah berjaga-jaga, 2to3 mungkin membuat kesalahan dan kemudian menggunakan list () untuk memaksa nilai yang dikembalikan dari range () ke dalam jenis senarai. 3. Jika terdapat fungsi xrange () dalam analisis senarai, tidak perlu menukar nilai pulangan ke dalam senarai, kerana analisis senarai sama berkesan untuk iterator. 4. Begitu juga, kitaran for juga berfungsi pada iterator, jadi tidak ada perubahan di sini. Fungsi sum ((() berfungsi sebagai iterator, jadi 2to3 tidak melakukan perubahan di sini. Sama seperti kaedah kelas kamus yang mengembalikan nilai sebagai pandangan (((view) dan bukan senarai, ini juga berlaku untuk min (((), max (((), sum (((), list (((), tuple (((), set (((), sorted (((), any (((), all (())
Python 2 mempunyai dua fungsi global yang digunakan untuk meminta input pengguna di baris perintah. Yang pertama dipanggil input (), yang menunggu pengguna memasukkan ungkapan Python (), dan kemudian mengembalikan hasilnya (). Yang kedua dipanggil raw_input (), dan apa yang dimasukkan pengguna dikembalikan ().
Notes | Python 2 | Python 3 |
---|---|---|
① | raw_input() | input() |
② | raw_input(‘prompt’) | input(‘prompt’) |
③ | input() | eval(input()) |
1 , Raw_input (() telah digantikan dengan input (()) dalam bentuk paling mudah. 2. Di Python 2, fungsi raw_input ((() boleh menetapkan tanda petunjuk sebagai argumen. Di Python 3, fungsi ini dikekalkan. 3. Jika anda benar-benar ingin meminta pengguna memasukkan ungkapan Python dan mengira hasilnya, anda boleh memanggil fungsi input () dan menghantar nilai yang dikembalikan kepada eval ()
Dalam Python 2, kod fungsi mempunyai akses ke sifat-sifat khas fungsi itu sendiri. Dalam Python 3, sifat-sifat khusus ini dinamakan semula untuk kesesuaian.
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 atribut ((aslifunc_name) mengandungi nama fungsi。 2、doc atribut ((aslifuncdoc) mengandungi senar dokumen yang anda tentukan dalam kod sumber fungsi ((docstring) 3、defaults sifat ((aslifunc_defaults) adalah satu subset yang menyimpan nilai lalai parameter. 4、dictattribute ((asl func_dict) adalah ruang nama yang menyokong sifat fungsi yang boleh dipilih. 5、closureattribute ((asl func_closure) adalah satu subset yang terdiri daripada objek cell, yang mengandungi ikatan fungsi kepada pembolehubah bebas ((free variable)). 6、globals sifat ((asl function_globals) adalah rujukan kepada ruang nama global modul, fungsi itu sendiri ditakrifkan dalam ruang nama tersebut. 7、code sifat ((aslifunc_code) adalah objek kod yang mewakili fungsi yang dikompilasi.
Dalam Python 2, objek fail mempunyai kaedah xreadlines () yang mengembalikan iterator yang membaca satu baris fail sekali. Ini sangat berguna dalam kitaran for. Sebenarnya, versi Python 2 kemudian menambah fungsi ini kepada objek fail itu sendiri.
Dalam Python 3, kaedah xreadlines () tidak lagi boleh digunakan. 2to3 boleh menyelesaikan keadaan mudah, tetapi beberapa kes pinggir memerlukan campur tangan tangan tangan.
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, jika anda memanggil xreadlines tanpa parameter sebelumnya (), 2to3 akan mengubahnya menjadi objek fail itu sendiri. Dalam Python 3, kod selepas penukaran ini dapat melakukan tugas yang sama seperti sebelumnya: membaca baris fail sekali, dan kemudian melakukan lingkaran lingkaran for. 2, jika anda menggunakan argumen ((bilangan baris setiap kali dibaca) untuk memanggil xreadlines ((), 2to3 tidak dapat menyelesaikan penukaran dari Python 2 ke Python 3 untuk anda, kod anda akan gagal dengan cara ini: AttributeError: ‘_io.TextIOWrapper’ object has no attribute ‘xreadlines’。 anda boleh mengubah xreadlines menjadi readlines secara manual supaya kod anda berfungsi di Python 3。 kaedah readline mengembalikan iterator di Python 3, jadi ia tidak sama dengan xreadlines di Python 2。
Dalam Python 2, anda boleh mentakrifkan fungsi lambda tanpa nama (anonymous lambda function) yang membolehkan fungsi ini menerima pelbagai parameter dengan menetapkan nombor elemen dalam satu subset sebagai argumen. Sebenarnya, penterjemah Python 2 mengurai subset ini menjadi argumen bernama (named arguments), dan anda boleh merujuknya dalam fungsi lambda (they are named). Dalam Python 3, anda masih boleh menghantar subset sebagai argumen untuk fungsi lambda, tetapi penterjemah Python tidak akan menguraikannya sebagai argumen bernama.
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, jika anda telah mentakrifkan fungsi lambda yang menggunakan satu unsur yang mengandungi satu unsur sebagai argumen, dalam Python 3, ia akan ditukarkan kepada satu yang mengandungi x1[Fungsi lambda yang dirujuk oleh 0] ialah。x1 yang dihasilkan secara automatik oleh skrip 2to3 berdasarkan parameter penamaan dalam subset asal。 Fungsi lambda yang menggunakan subset yang mengandungi dua elemen ((x, y) sebagai parameter ditukarkan kepada x_y, yang mempunyai dua parameter kedudukan, iaitu x_y[0] dan x_y[1]。 Skrip 3, 2to3 bahkan boleh menangani fungsi lambda yang menggunakan parameter nama tetingkap sebagai parameter. Kod yang dihasilkan agak sukar untuk dibaca, tetapi ia berfungsi sama di Python 3 dengan kod asal di Python 2. Anda boleh mentakrifkan fungsi lambda yang menggunakan lebih banyak parameter. Python 2 akan menganggapnya sebagai fungsi lambda yang mengandungi lebih banyak parameter jika tidak ada tanda kurung di sekitar parameter; dalam fungsi lambda ini, anda merujuk parameter ini dengan nama, seperti yang dilakukan dalam fungsi jenis lain.
Dalam Python 2, kaedah kelas boleh diakses untuk menentukan objek kelas mereka (class object), dan juga boleh diakses oleh objek kaedah (method object) itu sendiri. Im_self adalah objek contoh kelas; im_func adalah objek fungsi, dan im_class adalah kelas itu sendiri. Dalam Python 3, sifat-sifat ini dinamakan semula untuk mengikuti konvensyen penamaan sifat-sifat lain.
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_ |
Dalam Python 2, anda boleh membuat kelas anda sendiri dan membolehkan ia digunakan dalam konteks Boolean. Sebagai contoh, anda boleh menjadikan kelas ini sebagai contoh dan menggunakan objek contoh ini dalam pernyataan if. Untuk tujuan ini, anda menentukannonzero() kaedah, ia akan mengembalikan nilai True atau False, kaedah ini akan dipanggil apabila objek contoh berada dalam konteks BULL. Dalam Python 3, anda masih boleh melakukan fungsi yang sama, tetapi nama kaedah khas ini menjadibool()。
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 akan memanggil objek kelas apabila ia digunakan dalam konteks BULLbool(), bukannonzero()。
2 , bagaimanapun, jika anda mempunyai satu yang ditakrifkan menggunakan dua parameternonzero() kaedah, skrip 2 to3 akan menganggap bahawa kaedah yang anda tetapkan ini mempunyai kegunaan lain, oleh itu ia tidak akan mengubah kod.
Antara Python 2 dan Python 3, terdapat sedikit perubahan dalam tatabahasa untuk mentakrifkan nombor oktal.
Notes | Python 2 | Python 3 |
---|---|---|
① | x = 0755 | x = 0o755 |
Oleh kerana integer panjang dan integer telah diintegrasikan bersama, sys.maxint tidak lagi tepat. Tetapi kerana nilai ini berguna untuk mengesan keupayaan platform tertentu, ia disimpan oleh Python 3 dan dinamakan semula sebagai sys.maxsize.
Notes | Python 2 | Python 3 |
---|---|---|
① | from sys importmaxint | from sys importmaxsize |
② | a_function(sys.maxint) | a_function(sys.maxsize) |
1, maxint menjadi maxsize. 2. Semua sys.maxint akan berubah menjadi sys.maxsize.
Dalam Python 2, anda boleh menggunakan fungsi global callable ((() untuk memeriksa sama ada objek boleh dipanggil ((callable, seperti fungsi) }}. Dalam Python 3, fungsi global ini telah dibatalkan }}. Untuk memeriksa sama ada objek boleh dipanggil, anda boleh memeriksa kaedah khas__call_Kewujudan ______
Notes | Python 2 | Python 3 |
---|---|---|
① | callable(anything) | hasattr(anything,’_call_’) |
Dalam Python 2, fungsi global zip() boleh menggunakan pelbagai urutan sebagai parameter, dan ia mengembalikan senarai yang terdiri daripada subgrup. Subgrup pertama mengandungi elemen pertama dalam setiap urutan; subgrup kedua mengandungi elemen kedua dalam setiap urutan; dan seterusnya dipindahkan ke bawah. Dalam Python 3, zip() mengembalikan sebuah iterator, bukan senarai.
Notes | Python 2 | Python 3 |
---|---|---|
① | zip(a, b, c) | list(zip(a, b, c)) |
② | d.join(zip(a, b, c)) | no change |
Dalam bentuk yang paling mudah, anda boleh memulihkan fungsi sebelum fungsi zip dengan memanggil nilai yang dikembalikan oleh fungsi paket zip, fungsi list akan melalui iterator yang dikembalikan oleh fungsi zip, dan kemudian mengembalikan senarai hasil. Dalam konteks di mana semua elemen dalam susunan telah dilalui (contohnya di sini adalah panggilan kepada kaedah join), zip () yang dikembalikan oleh iterator dapat berfungsi dengan baik. Skrip 2to3 akan mengesan keadaan ini dan tidak akan mengubah kod anda.
Dalam Python 2, StandardError adalah subkelas bagi semua kecacatan terbina dalam selain StopIteration, GeneratorExit, KeyboardInterrupt, dan SystemExit. Dalam Python 3, StandardError telah dibatalkan; ia digantikan dengan Exception.
Notes | Python 2 | Python 3 |
---|---|---|
① | x =StandardError() | x =Exception() |
② | x =StandardError(a, b, c) | x =Exception(a, b, c) |
Pelbagai jenis konstan dalam modul types membantu anda menentukan jenis objek. Dalam Python 2, ia mengandungi konstan yang mewakili semua jenis data asas, seperti dict dan int. Dalam Python 3, ia telah dibatalkan. Ia hanya perlu digantikan dengan nama jenis asas.
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 dipetakan sebagai byte dan bukan str, kerana Python 2 dalam a sequence of bytes.
isinstance() berfungsi untuk memeriksa sama ada objek adalah contoh dari kelas atau jenis tertentu. Di Python 2, anda boleh menghantar satu subset yang terdiri daripada jenis ke instance, dan jika objek itu adalah jenis apa pun dalam subset, fungsi akan mengembalikan True. Di Python 3, anda masih boleh melakukannya, tetapi tidak disyorkan untuk menggunakan jenis sebagai argumen yang dihantar dua kali.
Notes | Python 2 | Python 3 |
---|---|---|
isinstance(x,(int,float,int)) | isinstance(x,(int,float)) |
Python 2 mempunyai dua jenis senar: senar yang dikodkan oleh Unicode dan senar yang tidak dikodkan oleh Unicode. Tetapi sebenarnya ada jenis lain, iaitu basestring. Ia adalah jenis data abstrak, iaitu superclass str dan unicode.
Notes | Python 2 | Python 3 |
---|---|---|
isinstance(x, basestring) | isinstance(x, str) |
Python 2.3 memperkenalkan modul itertools, yang mentakrifkan varian fungsi global zip (), map (), filter (), yang dikembalikan sebagai iterator, bukan senarai. Di Python 3, fungsi varian ini telah dibatalkan kerana fungsi global ini dikembalikan sebagai iterator.
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 |
Terdapat tiga pembolehubah dalam modul sys yang boleh anda akses untuk menangani pengecualian: sys.exc_type, sys.exc_value, sys.exc_traceback. (Sebenarnya, ini sudah ada pada zaman Python 1.) Sejak Python 1.5, penggunaan ketiga-tiga pembolehubah ini tidak lagi disyorkan kerana sys.exc_info yang baru dikeluarkan, yang merupakan satu subset yang mengandungi ketiga-tiga elemen di atas.
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] |
Dalam Python 2, anda tidak perlu meletakkan tanda kurung di sekitar nilai alir jika anda perlu menulis analisis senarai alir. Dalam Python 3, tanda kurung ini diperlukan.
Notes | Python 2 | Python 3 |
---|---|---|
[i for iin 1,2] | [i for iin(1,2)] |
Python 2 mempunyai fungsi yang dipanggil os.getcwd (() yang mengembalikan direktori kerja semasa sebagai senar (((tidak dikodkan dalam Unicode)). Oleh kerana sistem fail moden dapat menangani nama direktori yang dikodkan dengan heks, Python 2.3 memperkenalkan fungsi os.getcwdu (()) [2]. Fungsi os.getcwdu (() mengembalikan senar yang dikodkan dalam Unicode dari direktori kerja semasa.
Notes | Python 2 | Python 3 |
---|---|---|
os.getcwdu() | os.getcwd() |
Dalam Python 2, anda boleh menentukan parameter metaclass dalam deklarasi kelas, atau anda boleh menentukan peringkat kelas khusus (class-level)metaclass sifat, untuk mencipta subkelas.__metaclass_Atribut _ telah dipadamkan.
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 |
Pembetulan-pembetulan yang disenaraikan di bawah ini pada hakikatnya bukan pembetulan sebenar. Maksudnya, mereka hanya berkaitan dengan gaya kod dan tidak melibatkan kod. Tetapi pemaju Python sangat berminat untuk menjadikan gaya kod selaras mungkin. Untuk itu, terdapat panduan rasmi yang khusus untuk menggambarkan gaya kod Python.
Di Python 2, satu-satunya cara untuk menentukan set nilai literal ialah dengan memanggil set (a_sequence). Ini masih berfungsi di Python 3, tetapi menggunakan notasi baru (literal notation): tanda kurung besar ({}) adalah cara yang lebih jelas.
Skrip 2to3 secara lalai tidak membetulkan set ((() nilai literal. Untuk mengaktifkan fungsi ini, tentukan -f set_literal parameter semasa panggilan baris perintah 2to3.
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} |
Objek Python yang diimplementasikan dengan C boleh mengeksport sebuah buffer interface yang membolehkan kod Python lain membaca dan menulis secara langsung ke dalam memori. Kedengarannya kuat, tetapi ia juga menakutkan. Dalam Python 3, buffer telah dinamakan semula sebagai memoryview. Perubahan sebenar lebih rumit, tetapi anda boleh mengabaikan perbezaan ini.
Skrip 2to3 secara lalai tidak akan membetulkan fungsi buffer (). Untuk mengaktifkan fungsi ini, tentukan -f buffer parameter semasa panggilan baris perintah 2to3.
Notes | Before | After |
---|---|---|
x =buffer(y) | x =memoryview(y) |
Walaupun Python sangat ketat mengenai ruang untuk mengindentifikasi dan memunculkan, Python bebas untuk menggunakan ruang dalam aspek lain. Dalam senarai, subgrup, kumpulan dan kamus, ruang boleh muncul di depan atau di belakang tanda koma, yang tidak akan memberi kesan buruk. Namun, buku panduan gaya kod Python menyatakan bahawa tidak boleh ada ruang sebelum koma, dan koma harus mengandungi ruang. Walaupun ini hanya pertimbangan estetika semata-mata, kod masih boleh berfungsi dengan baik, baik di Python 2 dan Python 3, tetapi skrip 2to3 dapat menyelesaikan pembaikan ini untuk anda berdasarkan standard dalam buku panduan.
Skrip 2to3 secara lalai tidak membetulkan ruang di sekitar tanda koma. Untuk mengaktifkan ini, tentukan -f wscomma parameter semasa panggilan baris perintah 2to3.
Notes | Before | After |
---|---|---|
a ,b | a, b | |
{a :b} | {a: b} |
Terdapat banyak rutin yang telah ditubuhkan dalam komuniti Python. Terdapat beberapa rutin seperti while 1: loop, yang bermula dari Python 1. Python tidak mempun