Hampir semua program Python 2 memerlukan beberapa pengubahsuaian untuk berjalan dengan baik dalam persekitaran Python 3. Untuk mempermudah proses penukaran ini, Python 3 membawa skrip utiliti yang dipanggil 2to3, yang akan mengambil fail sumber program Python 2 anda sebagai input dan kemudian mengubahnya secara automatik ke bentuk Python 3. Kajian kes: memindahkan chardet ke Python 3 menerangkan bagaimana menjalankan skrip ini, dan kemudian menunjukkan beberapa keadaan yang tidak dapat diperbaiki secara automatik. Lampiran ini menerangkan apa yang dapat diperbaiki secara automatik.
Dalam Python 2, print adalah satu statement. Apa sahaja yang anda ingin keluarkan, anda boleh meletakkan mereka di belakang kata kunci print. Dalam Python 3, print adalah fungsi. Seperti fungsi lain, print memerlukan anda untuk menghantar apa yang anda ingin keluarkan sebagai parameter.
Nota | Python 2 | Python 3 |
---|---|---|
① | cetakan | print ((() |
② | cetak 1 | cetakan ((1) |
③ | 1,2 cetakan | cetakan ((1,2) |
④ | cetak 1,2, | print ((1,2,end= |
⑤ | print >>sys.stderr,1,2,3 | print ((1,2,3, fail=sys.stderr) |
1, untuk mengeluarkan baris kosong, print tanpa parameter perlu dipanggil.
2, Untuk mengeluarkan nilai yang berasingan, anda perlu menggunakan nilai ini sebagai parameter print ().
3. Untuk output menggunakan dua nilai yang dipisahkan oleh ruang kosong, anda boleh memanggil print ((() dengan dua parameter.
Contoh ini mempunyai beberapa trik. Pada Python 2, jika anda menggunakan koma sebagai akhir print statement, ia akan mengeluarkan hasil dengan ruang terpisah dan kemudian mengeluarkan ruang yang diteruskan tanpa mengeluarkan carriage return. Pada Python 3, kesan yang sama dapat dicapai dengan menyampaikan end=
Python 2 mempunyai dua jenis tali:Senar UnicodedanSenar bukan Unicode◎ Python 3 hanya mempunyai satu jenis:String Unicode。
Nota | Python 2 | Python 3 |
---|---|---|
① | ||
② | ur |
r |
String Unicode dalam Python 2 adalah strings biasa dalam Python 3, kerana dalam Python 3 strings sentiasa dalam bentuk Unicode. Senar asli Unicode ((raw string) ((dengan menggunakan senar ini, Python tidak akan secara automatik menterjemahkan kebalik slope") juga digantikan sebagai senar biasa, kerana di Python 3, semua senar asli dikodkan dalam Unicode.
Python 2 mempunyai dua fungsi global yang boleh memaksa objek untuk ditukar menjadi tali: unicode (() mengubah objek menjadi tali Unicode, dan str (() mengubah objek menjadi tali bukan Unicode. Python 3 hanya mempunyai satu jenis tali, tali Unicode, jadi str (() berfungsi untuk menyelesaikan semua fungsi.Fungsi unicode ((() tidak lagi wujud di Python 3.)
Nota | Python 2 | Python 3 |
---|---|---|
① | Unicode ((apa sahaja) | apa-apa pun. |
Python 2 mempunyai jenis int dan long yang disediakan untuk bilangan tidak berpendar. Maksimum jenis int tidak boleh melebihi sys.maxint, dan maksimum ini berkaitan platform. Integer panjang boleh ditakrifkan dengan menambahkan L di akhir nombor, yang jelas lebih besar daripada jumlah yang dinyatakan oleh jenis int. Dalam Python 3, hanya ada satu jenis integer int, yang dalam kebanyakan kes menyerupai integer panjang dalam Python 2. Oleh kerana kedua-dua jenis integer tidak ada lagi, tidak perlu menggunakan tatabahasa khas untuk membezakan mereka.
Baca lebih lanjut: PEP 237: Kesatuan bentuk panjang dan bentuk keseluruhan.
Nota | Python 2 | Python 3 |
---|---|---|
① | x = 1000000000000L | x = 1000000000000 |
② | x = 0xFFFFFFFFFFFFL | x = 0xFFFFFFFFFF |
③ | panjang ((x) | int(x) |
④ | jenis ((x) adalah panjang | jenis ((x) ialah int |
⑤ | isinstance ((x,panjang) | isinstance ((x,int) |
Dalam Python 2, integer decimal telah digantikan dengan bilangan bulat biasa decimal pada Python 3. Integer berangka 16 dalam Python 2 digantikan dengan integer biasa berangka 16 dalam Python 3. Dalam Python 3, kerana bentuk bulat tidak lagi wujud, bentuk bulat tidak lagi wujud.Fungsi long ((() semula jadi juga tidak ada. Untuk memaksa penukaran suatu pembolehubah kepada integer, fungsi int ((() boleh digunakan.Saya tidak tahu. Memeriksa sama ada satu pembolehubah adalah bulat, mendapatkan jenis datanya, dan membandingkannya dengan jenis int (bukan panjang). Anda juga boleh menggunakan fungsi istance (() untuk memeriksa jenis data; sekali lagi, int, bukan long, digunakan untuk memeriksa jenis integer.
Python 2 menyokong <> sebagai sinonim!=. Python 3 hanya menyokong!=, dan tidak lagi menyokong <>.
Nota | Python 2 | Python 3 |
---|---|---|
① | jika x <> y: | jika x!= y: |
② | jika x <> y <> z: | jika x!= y!= z: |
1, perbandingan mudah. 2, perbandingan antara tiga nilai yang agak kompleks.
Dalam Python 2, kaedah has_key untuk objek kamus digunakan untuk menguji sama ada kamus mengandungi kunci tertentu. Python 3 tidak lagi menyokong kaedah ini.dalamOperator.
Nota | Python 2 | Python 3 |
---|---|---|
① | a_dictionary.has_key (( |
|
② | a_dictionary.has_key ((x) atau a_dictionary.has_key ((y) | x dalam kamus atau y dalam kamus |
③ | a_dictionary.has_key ((x atau y) | (x atau y) dalam kamus |
④ | a_dictionary.has_key ((x + y) | (x + y) dalam kamus |
⑤ | x + a_dictionary.has_key(y) | x + (y dalam kamus) |
1, bentuk yang paling mudah.
2 ∞, dan keutamaan operator or adalah lebih rendah daripada operator in, jadi tidak perlu menambahkan tanda kurung di sini.
3. Sebaliknya, untuk sebab yang sama, keutamaan
Dalam Python 2, nilai pulangan banyak kaedah dictionary adalah senarai; yang paling biasa digunakan ialah kunci, item, dan nilai; dalam Python 3, nilai pulangan semua kaedah di atas ditukar kepada pandangan dinamik; dalam beberapa persekitaran konteks, perubahan ini tidak memberi kesan; jika nilai pulangan kaedah tersebut dihantar kepada fungsi lain dengan segera, dan fungsi itu akan melintasi seluruh barisan, maka nilai pulangan kaedah tersebut adalah senarai atau pandangan dan tidak akan menghasilkan apa-apa perbezaan; dalam beberapa kes lain, hubungan Python 3; harapan yang besar adalah bahawa jika anda mempunyai senarai elemen yang boleh dihubungi secara bebas, maka perubahan dalam Python 3 akan membuat kod anda terjebak, kerana pandangan grafik tidak menyokong indeksasi.
Nota | Python 2 | Python 3 |
---|---|---|
① | a_dictionary.keys() | senarai (a_dictionary.keys) |
② | a_dictionary.items() | senarai ((a_dictionary.items()) |
③ | a_dictionary.iterkeys() | iter ((a_dictionary.keys()) |
④ | [i untuk iin a_dictionary.iterkeys() ] | [i untuk iin a_dictionary.keys() ] |
⑤ | min(a_dictionary.keys()) | tiada perubahan |
1, menggunakan fungsi list ((() untuk menukar nilai pulangan keys ((() ke dalam senarai statik. Untuk alasan keselamatan, 2to3 mungkin akan memberikan kesalahan. Kod ini berkesan, tetapi ia agak kurang cekap untuk menggunakan pandangan. Anda harus memeriksa kod yang ditukar untuk melihat sama ada anda pasti memerlukan senarai, dan mungkin pandangan juga dapat melakukan kerja yang sama. 2, ini adalah pandangan lain (untuk kaedah item) untuk menukar ke dalam senarai. Cara 2to3 untuk nilai juga akan mengembalikan nilai. 3, Python 3 tidak lagi menyokong iterkeys. Jika perlu, gunakan iter untuk menukar nilai pulangan keys ke iterator. 4, 2to3 dapat mengenal pasti kaedah iterkeys (,) yang digunakan dalam analisis senarai, dan mengubahnya menjadi keys (,) kaedah ( (,) yang tidak memerlukan penggunaan tambahan iter (,) untuk membungkus nilai pulangnya). 5, 2to3 juga dapat mengenal pasti bahawa nilai pulangan dari kaedah keys (() akan dihantar kepada fungsi lain yang akan melintasi keseluruhan siri, jadi tidak perlu menukar nilai pulangan keys (() ke senarai terlebih dahulu. Sebaliknya, fungsi min (()) akan dengan senang hati melintasi pandangan. Proses ini sama berkesan untuk min ((), max ((), sum ((), tuple ((), setlist ((), sorted ((), any (() dan all (()).
Dari Python 2 ke Python 3, beberapa modul dalam perpustakaan standard telah dinamakan semula. Beberapa modul yang berkaitan antara satu sama lain juga telah digabungkan atau disusun semula untuk membuat hubungan ini lebih logik.
Nota | Python 2 | Python 3 |
---|---|---|
① | import httplib | Import http.client |
② | Import Kuki | Import http.cookies |
③ | import cookielib | Import http.cookiejar |
④ | Import BaseHTTPServer import SimpleHTTPServer import CGIHttpServer |
Import http.server |
Modul http.client melaksanakan perpustakaan bawah yang boleh digunakan untuk meminta sumber HTTP dan menganalisis tindak balas HTTP. Modul http.cookies menyediakan antara muka Python yang menyeronokkan untuk mendapatkan kuki yang dihantar melalui header HTTP Set-Cookie Penyemak imbas yang biasa digunakan menyimpan kuki dalam bentuk fail pada cakera, dan modul http.cookiejar boleh mengendalikan fail ini. Modul http.server melaksanakan pelayan HTTP asas
Nota | 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 |
⑤ | dari urllib import FancyURLopener dari urllib import urlencode |
daripada urllib.request import FancyURLopener dari urllib.parse import urlencode |
⑥ | daripada urllib2 import Permintaan daripada urllib2 import HTTPError |
daripada urllib.request import Permintaan dari urllib.error import HTTPError |
Sebelum ini, modul urllib dalam Python 2 mempunyai pelbagai fungsi, termasuk urlopen yang digunakan untuk mendapatkan data, dan berguna untuk membahagikan URL ke dalam fungsi splittype (), splithost (), dan splituser (). Dalam pakej urllib baru, fungsi-fungsi ini dianjurkan dengan lebih logik. 2to3 akan mengubah panggilan fungsi-fungsi ini untuk menyesuaikan skema penamaan baru. Dalam Python 3, modul urllib2 terdahulu telah disatukan ke dalam pakej urllib. Pada masa yang sama, pelbagai perkara kegemaran anda dalam urllib2 akan muncul secara bersama-sama dalam modul urllib Python 3, seperti kaedah build_opener (), objek permintaan, HTTPBasicAuthHandler dan rakan-rakan. Modul urllib.parse dalam Python 3 mengandungi semua fungsi analisis dalam modul urlparse pada Python 2. Modul urllib.robotparse menganalisis fail robots.txt. Kelas FancyURLopener yang menangani pengalihan HTTP dan kod keadaan lain masih sah dalam modul urllib.request dalam Python 3. Fungsi urlencode telah dipindahkan ke urllib.parse. Objek permintaan masih sah di urllib.request, tetapi konstanta seperti HTTPError telah dipindahkan ke urllib.error. Adakah saya pernah menyebut 2to3 akan menulis semula panggilan fungsi anda? Sebagai contoh, jika anda mengimport modul urllib dalam kod Python 2 anda dan memanggil urllib.urlopen () fungsi untuk mendapatkan data, 2to3 akan mengubah kata import dan panggilan fungsi pada masa yang sama.
Nota | Python 2 | Python 3 |
---|---|---|
① | import urllib print urllib.urlopen"http://diveintopython3.org/’) baca ()) | import urllib.request, urllib.parse, urllib.error print ((urllib.request.urlopen))"http://diveintopython3.org/’.baca. |
Nota | Python 2 | Python 3 |
---|---|---|
① | import dbm | import dbm.ndbm |
② | import gdbm | importdbm.gnu |
③ | import dbhash | Import dbm.bsd |
④ | import dumbdbm | Import dbm.dumb |
⑤ | import mana-mana import mana-mana |
import dbm |
Nota | Python 2 | Python 3 |
---|---|---|
① | Import xmlrpclib | Import xmlrpc.client |
② | import DocXMLRPCServer import SimpleXMLRPCServer |
Import xmlrpc.server |
Nota | Python 2 | Python 3 |
---|---|---|
① | cuba: import cStringIO sebagai StringIO kecuali ImportError: import StringIO |
Pengimportan |
② | cuba: import cPickle sebagai acar kecuali ImportError: import acar |
acar import |
③ | import _Dibina | import bangunan |
④ | import copy_reg | import copyreg |
⑤ | barisan import | barisan import |
⑥ | import SocketServer | import socketserver |
⑦ | Import ConfigParser | import configparser |
⑧ | import repr | import reprlib |
⑨ | perintah import | Subproses import |
1. Dalam Python 2, anda biasanya akan melakukan ini dengan cuba mengimport cStringIO sebagai pengganti StringIO terlebih dahulu, dan jika gagal, mengimport semula StringIO. Jangan lakukan ini dalam Python 3; modul io akan membantu anda menangani perkara ini. 2. Dalam Python 2, mengimport pelaksanaan pickle terpantas juga merupakan kaedah yang berguna yang serupa dengan di atas. Dalam Python 3, modul pickle akan memprosesnya secara automatik untuk anda, jadi jangan lakukan lagi. Modul builtins mengandungi fungsi global, kelas, dan konstanta yang akan digunakan di seluruh bahasa Python. Menggambarkan semula sesuatu fungsi dalam modul builtins bermaksud menentukan semula fungsi global ini di mana-mana. Ini terdengar kuat, tetapi juga menakutkan. 4. Modul copyreg menambah sokongan untuk modul pickle untuk jenis kustom pengguna yang ditakrifkan dalam bahasa C. 5. Modul queue mewujudkan antrian pengeluar-pengguna (multi-producer, multi-consumer queue). 6. Modul socketserver menyediakan kelas asas umum untuk melaksanakan pelbagai pelayan socket. 7. Modul configparser digunakan untuk menguraikan fail profil INI-style. 8. Modul reprlib mengimplementasikan semula fungsi repr () terbina dalam dan menambah kawalan terhadap panjang yang dinyatakan oleh string sebelum dipotong. 9. Modul subproses membolehkan anda membuat subproses, menyambung ke paip mereka, dan mendapatkan nilai pulangnya.
Paket adalah entiti tunggal yang terdiri daripada sekumpulan modul yang berkaitan. Pada masa Python 2, untuk mencapai rujukan antara satu sama lain untuk modul dalam paket yang sama, anda menggunakan import foo atau from foo import Bar.2解释器会先在当前目录里搜索foo.pyPada Python 3, proses ini agak berbeza. Python 3 tidak mencari pada laluan semasa terlebih dahulu, ia akan mencari secara langsung di laluan pencarian Python. Jika anda mahu satu modul dalam pakej mengimport satu lagi modul dalam pakej, anda perlu memberikan laluan relatif kedua-dua modul secara jelas.
Katakan anda mempunyai beberapa fail dalam direktori yang sama seperti berikut:
Chardet/ Perhatikan. ±-mulakan.py Perhatikan.+--konstan.py | +--mbcharsetprober.py | +--universaldetector.py
Sekarang anggaplah universaldector.py memerlukan keseluruhan import constants.py,另外还需要导入mbcharsetprober.py的一个类。你会怎样做?
Nota | Python 2 | Python 3 |
---|---|---|
① | konstanta import | daripada.import constants |
② | daripada mbcharsetprober import MultiByteCharSetProber | dari.mbcharsetprober import MultiByteCharsetProber |
1. Apabila anda perlu mengimport keseluruhan modul dari tempat lain dalam pakej, gunakan sintaks baru dari.import.universaldetector.py) dan anda ingin mengimport fail ((constants.pyDalam contoh ini, kedua-dua fail berada di dalam direktori yang sama, jadi tanda baca tunggal digunakan. Anda juga boleh mengimport dari direktori induk ((from... import anothermodule) atau direktori anak. 2. Untuk mengimport kelas atau fungsi tertentu dari modul lain secara langsung ke ruang nama modul anda, tambahkan laluan relatif di hadapan modul yang ingin diimport, dan hilangkan garis slash terakhir. Dalam contoh ini, mbcharsetprober.py dan universaldetector.py berada dalam direktori yang sama, jadi nama laluan relatif adalah koma. Anda juga boleh mengimport dari direktori induk (dari... import anothermodule) atau direktori anak.
Dalam Python 2, iterator mempunyai kaedah next (), yang digunakan untuk mengembalikan item seterusnya dalam siri. Dalam Python 3, ini juga berfungsi, tetapi kini terdapat fungsi global baru next (), yang menggunakan iterator sebagai parameter.
Nota | Python 2 | Python 3 |
---|---|---|
① | anIterator.next ((() | seterusnya ((aniterator) |
② | a_function_that_returns_an_iterator().next() | next ((a_function_that_returns_an_iterator()) |
③ | kelas A: def seterusnya ((diri): lulus |
kelas A: def _seterusnya_(sendiri): |
④ | kelas A: def seterusnya ((self, x, y): lulus |
tiada perubahan |
⑤ | seterusnya = 42 untuk an_iterator dalam a_sequence_of_iterators: an_iterator.next() |
seterusnya = 42 untuk an_iterator dalam a_sequence_of_iterators: an_iterator._seterusnya_() |
Contoh yang paling mudah ialah, anda tidak lagi memanggil kaedah next (() pada sebuah 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 sampaikan hasilnya sebagai parameter kepada fungsi next(((((script 2to3 cukup pintar untuk melakukan penukaran ini dengan betul. 3. jika anda menganggap kelas anda sendiri dan menggunakannya sebagai pengulangan, dalam Python 3, anda boleh menggunakan kaedah khusus untuk menentukanseterusnya_Saya tidak tahu apa yang akan berlaku. 4, jika kelas yang anda tentukan mempunyai next (), ia menggunakan satu atau lebih parameter, 2to3 tidak akan menggerakkannya semasa pelaksanaan. Kelas ini tidak boleh digunakan sebagai pengulangan kerana kaedah next () mempunyai parameter. 5. Ini agak rumit. Jika anda kebetulan mempunyai pembolehubah tempatan yang dipanggil next, dalam Python 3 ia akan mempunyai keutamaan yang lebih tinggi daripada fungsi global next. Dalam kes ini, anda perlu memanggil kaedah khusus iterator.seterusnya_() untuk mendapatkan elemen seterusnya dalam siri tersebut. Atau, anda juga boleh menyusun semula kod agar nama pembolehubah tempatan ini tidak dipanggil next, tetapi 2to3 tidak akan melakukan perkara ini untuk anda.
Dalam Python 2, kaedah filter ((() mengembalikan senarai yang diperiksa oleh fungsi yang mengembalikan nilai True atau False untuk setiap item dalam siri tersebut. Dalam Python 3, fungsi filter ((() mengembalikan pengulangan dan bukan lagi senarai.
Nota | Python 2 | Python 3 |
---|---|---|
① | filter ((a_function, a_sequence) | senarai ((filter ((a_function, a_sequence)) |
② | senarai ((filter ((a_function, a_sequence)) | tiada perubahan |
③ | filter ((Tidak ada, a_sequence) | [i untuk dalam urutan jika i] |
④ | untuk i dalam penapis ((Tidak ada, a_urutan): | tiada perubahan |
⑤ | [i untuk dalam penapis ((a_fungsi, a_urutan) ] | tiada perubahan |
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 panggilan filter ((() telah diliputi oleh list ((), 2to3 tidak akan memprosesnya lagi, kerana dalam kes ini, sama ada nilai yang dikembalikan oleh filter ((() adalah pengulangan tidak penting. 3. Untuk memproses sintaks khas seperti filter ((None,...), 2to3 akan menukar panggilan ini dari persamaan sintaks kepada pemprosesan senarai. 4. Oleh kerana putaran for akan melintasi keseluruhan siri, tidak perlu melakukan perubahan lagi. 5, sama seperti di atas, tidak perlu dilakukan perubahan, kerana senarai akan diselesaikan di seluruh urutan, walaupun filter () kembali kepada satu pengulangan, ia masih berfungsi dengan baik seperti filter () yang sebelum ini kembali ke senarai.
Seperti perubahan yang dibuat oleh filter (), fungsi map (), kini mengembalikan satu iterator.
Nota | Python 2 | Python 3 |
---|---|---|
① | peta ((a_function, |
Senarai (map) fungsi (Papaya Whip) |
② | Peta ((Tidak ada, |
senarai (( |
③ | peta ((lambda x: x+1,range ((42)) | [x+1untuk x dalam julat(42)] |
④ | untuk i dalam peta ((a_fungsi, a_urutan): | tiada perubahan |
⑤ | [i untuk imej (a_function,a_sequence) ] | tiada perubahan |
1, sama seperti pengendalian terhadap filter (), dalam kes yang paling mudah, 2to3 menggunakan fungsi list (), untuk membungkus panggilan map (). 2、 untuk map khusus ((None,...) sintaks, seperti filter ((None,...) 2to3 akan menukarnya kepada panggilan setara dengan menggunakan list ((( 3, jika parameter pertama map () adalah fungsi lambda, 2to3 akan menukarnya secara setara kepada pemotongan senarai. 4. Tiada perubahan yang perlu dibuat untuk putaran for yang akan melintasi keseluruhan siri. 5, sekali lagi, tidak perlu diubah di sini kerana senarai akan disemak sepanjang siri, walaupun nilai yang dikembalikan oleh map ((() adalah pengulangan dan bukan senarai, ia akan berfungsi dengan baik.
Dalam Python 3, fungsi reduce (), yang telah dikeluarkan dari ruang nama global, kini ditempatkan di modul fucntools.
Nota | Python 2 | Python 3 |
---|---|---|
① | mengurangkan ((a, b, c) | daripada alat fungsi import mengurangkan mengurangkan ((a, b, c) |
Python 2 mempunyai fungsi global yang dipanggil apply ((), yang menggunakan fungsi f dan senarai [a, b, c] sebagai parameter, dan nilai pulangnya adalah f ((a, b, c)). Anda juga boleh melakukan perkara yang sama dengan memanggil fungsi ini secara langsung dan menambahkan tanda bintang ((*) sebagai parameter yang dihantar kepadanya di hadapan senarai. Dalam Python 3, fungsi apply (() tidak lagi wujud; anda mesti menggunakan tanda bintang.
Nota | 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, dalam bentuk yang paling mudah, fungsi boleh dipanggil dengan menambahkan bintang di hadapan senarai parameter (seperti [a, b, c]). Ini adalah sama dengan fungsi apply (() dalam Python 2. 2. Dalam Python 2, fungsi apply (,) sebenarnya boleh membawa 3 parameter: satu fungsi, satu senarai parameter, dan sebuah kamus nama argumen (). Dalam Python 3, anda boleh menambahkan bintang sebelum senarai parameter ().), penambahan dua bintang ((**) sebelum parameter nama kamus untuk mencapai kesan yang sama. 3. Operator + di sini digunakan sebagai fungsi senarai yang disambungkan dan mempunyai keutamaan yang lebih tinggi daripada operator, jadi tidak perlu menambah kurung tambahan di sekitar a_list_of_args + z. Skrip 4, 2to3 cukup pintar untuk menukar panggilan aplikasi yang rumit, termasuk panggilan fungsi import dalam modul.
Dalam Python 2, anda boleh menggunakan fungsi intern untuk mengehadkan fungsi ini pada satu senar untuk mencapai pengoptimuman prestasi. Dalam Python 3, fungsi intern telah dipindahkan ke modul sys.
Nota | Python 2 | Python 3 |
---|---|---|
① | intern ((aString) | sys.intern ((aString) |
Sama seperti print statements yang menjadi fungsi dalam Python 3, execute statements menggunakan strings yang mengandungi mana-mana kod Python sebagai parameter, dan kemudian mengeksekusi mereka seperti execute statements atau expressions..exec adalah serupa denganeval, tetapi execute adalah lebih kuat dan lebih canggih..eval hanya boleh melaksanakan satu ekspresi tunggal, tetapi execute boleh melaksanakan banyak pernyataan, import, dan fungsi.
Nota | Python 2 | Python 3 |
---|---|---|
① | exec codeString | exec ((codeString) |
② | exec codeString dalam ruang nama global | exec ((codeString, a_global_namespace) |
③ | exec codeString dalam ruang nama global, ruang nama tempatan | 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 baris ini dengan kurung tanda. 2. Perkataan exec dalam Python 2 boleh menentukan ruang nama, kod akan dilaksanakan dalam ruang peribadi yang terdiri daripada objek global. Python 3 juga mempunyai fungsi ini; anda hanya perlu menyampaikan ruang nama ini sebagai parameter kedua kepada fungsi exec (). 3. Lebih menarik lagi, pernyataan exec dalam Python 2 juga boleh menentukan ruang nama tempatan (seperti pembolehubah yang diisytiharkan dalam fungsi). Dalam Python 3, fungsi exec juga mempunyai fungsi ini.
Seperti kata-kata exec sebelum ini, kata-kata execfile dalam Python 2 juga boleh menggunakan string seperti menjalankan kod Python. Perbezaan adalah bahawa exec menggunakan string, sedangkan execfile menggunakan fail. Dalam Python 3, kata-kata execfile telah dihapuskan. Jika anda benar-benar ingin menjalankan kod Python dalam fail (tetapi anda tidak mahu mengimportnya), anda boleh melakukannya dengan membuka fail ini, membaca isinya, dan kemudian memanggil fungsi kompile) global (Python interpreter memaksa kod disusun, dan kemudian memanggil fungsi exec baru).
Nota | Python 2 | Python 3 |
---|---|---|
① | execfile (( |
exec(compile(open( |
Dalam Python 2, untuk mendapatkan strings yang mewakili sebarang objek, terdapat satu cara untuk membungkus objek dalam countercitation (misalnyax
Dalam Python 3, keupayaan ini masih wujud, tetapi anda tidak boleh lagi menggunakan tanda kutip untuk mendapatkan strings ini; anda perlu menggunakan fungsi global repr ((((().
Nota | Python 2 | Python 3 |
---|---|---|
① | `x` | repr ((x) |
② | ` |
repr (( |
1, ingat, x boleh menjadi apa-apa
Bahasa yang digunakan untuk menangkap kecacatan mungkin berbeza dari Python 2 ke Python 3.
Nota | Python 2 | Python 3 |
---|---|---|
① | cuba: import mymodule kecuali ImportError, e lulus |
cuba: import mymodule kecuali ImportError sebagai e: lulus |
② | cuba: import mymodule kecuali (RuntimeError, ImportError), e lulus |
cuba: import mymodule kecuali (RuntimeError, ImportError) sebagai e: lulus |
③ | cuba: import mymodule kecuali ImportError: lulus |
tiada perubahan |
④ | cuba: import mymodule kecuali: lulus |
tiada perubahan |
1, berbanding dengan Python 2 yang menambahkan koma selepas jenis yang luar biasa, Python 3 menggunakan kata kunci baru, as. 2, kata kunci as juga boleh digunakan untuk menangkap pelbagai jenis kelainan pada satu masa. 3. Jika anda menangkap sesuatu yang luar biasa tetapi tidak mahu mengakses objek yang luar biasa itu sendiri, sintaks Python 2 dan Python 3 adalah sama. 4. Begitu juga, jika anda menggunakan kaedah selamat (fallback) untuk menangkap semua kecacatan, sintaks Python 2 dan Python 3 adalah sama. 5. Apabila mengimport modul (atau dalam kebanyakan kes lain), anda tidak boleh menggunakan kaedah ini (menunjukkan fallback di atas); jika tidak, program mungkin menangkap kecacatan seperti KeyboardInterrupt (jika pengguna menekan Ctrl-C untuk mengganggu program), yang menjadikan penyusunan kesalahan lebih sukar.
Dalam Python 3, terdapat sedikit perubahan dalam tatabahasa untuk membuang kebiasaannya.
Nota | Python 2 | Python 3 |
---|---|---|
① | meningkatkan MyException | tidak berubah |
② | meningkatkan MyException, |
meningkatkan MyException (Mesej ralat) |
③ | meningkatkan MyException, |
meningkatkan MyException (Mesej ralat).with_traceback (Risalah) |
④ | meningkatkan |
tidak disokong |
1. membuang kecacatan yang tidak membawa maklumat yang salah yang disesuaikan oleh pengguna, dalam bentuk yang paling mudah, sintaks tidak berubah. 2, perubahan adalah jelas apabila anda ingin membuang sesuatu yang luar biasa dengan mesej ralat yang disesuaikan pengguna; Python 2 menggunakan koma untuk memisahkan jenis ralat dan mesej ralat; Python 3 menyampaikan maklumat ralat sebagai parameter kepada jenis ralat; 3. Python 2 menyokong sintaks yang lebih kompleks untuk membuang pengecualian dengan jejak tumpukan yang disesuaikan pengguna. Dalam Python 3 anda juga boleh melakukan ini, tetapi sintaksnya sama sekali berbeza. 4. Dalam Python 2, anda boleh membuang pengecualian tanpa kelas pengecualian, hanya satu mesej pengecualian. Dalam Python 3, bentuk ini tidak lagi disokong. 2to3 akan memberi amaran kepada anda bahawa ia tidak dapat membetulkan sintaks ini secara automatik.
Dalam Python 2, penjana mempunyai kaedah throw (); memanggil a_generator.throw (); akan melemparkan keanehan apabila penjana dihentikan dan mengembalikan nilai seterusnya yang diambil oleh fungsi penjana. Dalam Python 3, fungsi ini masih boleh digunakan, tetapi sedikit berbeza secara tatabahasa.
Nota | Python 2 | Python 3 |
---|---|---|
① | a_generator.throw(MyException) | tiada perubahan |
② | a_generator.throw ((MyException, |
a_generator.throw(MyException( |
③ | a_generator.throw( |
tidak disokong |
1. Dalam bentuk yang paling mudah, penjana membuang pengecualian yang tidak membawa mesej ralat yang disesuaikan oleh pengguna. Dalam kes ini, tidak ada perubahan dalam tatabahasa dari Python 2 ke Python 3. 2. Jika penjana membuang satu kecacatan dengan mesej ralat yang disesuaikan pengguna, anda perlu menyampaikan string mesej ralat ini kepada kelas kecacatan untuk mencontohkannya. 3. Python 2 juga menyokong membuang pengecualian yang hanya menghantar mesej yang luar biasa. Python 3 tidak menyokong sintaks ini, dan 2to3 akan memaparkan mesej amaran yang memberitahu anda bahawa kod ini perlu diperbaiki secara manual.
Dalam Python 2, terdapat dua cara untuk mendapatkan nombor dalam julat tertentu: range (), yang mengembalikan senarai, dan range (), yang mengembalikan pengulangan. Dalam Python 3, range (), yang mengembalikan pengulangan, xrange (), tidak lagi wujud.
Nota | Python 2 | Python 3 |
---|---|---|
① | xrange ((10) | Julat ((10) |
② | a_list = julat ((10) | a_list = senarai (range) |
③ | [i untuk dalam xrange(10)] | [i untuk julat dalam ((10)] |
④ | untuk i dalam julat ((10): | tiada perubahan |
⑤ | jumlah (range) | tiada perubahan |
1, dalam kes yang paling mudah, 2to3 akan menukar xrange (x) kepada range (x). 2, Jika kod Python 2 anda menggunakan range (), 2to3 tidak tahu sama ada anda memerlukan senarai, atau sama ada pengulang juga berfungsi. Sebagai langkah berjaga-jaga, 2to3 mungkin akan memberikan kesalahan, dan kemudian menggunakan list (), memaksa nilai pulangan range ()) menjadi jenis senarai. 3. Jika terdapat fungsi xrange (xrange) dalam pembetulan senarai, tidak perlu menukar nilai pulangnya ke dalam senarai kerana pembetulan senarai adalah sama untuk pengulangan. 4. Begitu juga, loop for juga berfungsi pada pengulang, jadi tidak ada perubahan di sini. 5, fungsi sum () boleh berfungsi pada iterator, jadi 2to3 juga tidak diubah di sini. Sama seperti kaedah kelas kamus yang mengembalikan nilai sebagai pandangan daripada senarai, ini juga berlaku untuk min (), max (), sum (), list (), tuple (), set (), sorted (), any (), all (), dan lain-lain.
Python 2 mempunyai dua fungsi global yang digunakan untuk meminta input pengguna pada baris perintah. Yang pertama dipanggil input, yang menunggu pengguna memasukkan ungkapan Python dan kemudian mengembalikan hasil. Yang kedua dipanggilraw_input, yang mengembalikan apa yang dimasukkan oleh pengguna. Ini sangat membingungkan bagi pemula, dan ini secara meluas dilihat sebagai keropok keropok bahasa Python.
Nota | Python 2 | Python 3 |
---|---|---|
① | raw_input() | input ((() |
② | raw_input (( |
input (( |
③ | input ((() | nilai (input) |
Dalam bentuk yang paling mudah, raw_input (() digantikan dengan input (()). 2, dalam Python 2, fungsi raw_input (() boleh menetapkan isyarat sebagai parameter. Dalam Python 3, fungsi ini dikekalkan. 3. Jika anda benar-benar ingin meminta pengguna memasukkan ungkapan Python, hasil pengiraan boleh dilakukan dengan memanggil fungsi input ((() dan menghantar nilai balik kepada eval ((().
Dalam Python 2, kod dalam fungsi boleh mengakses sifat-sifat khas fungsi itu sendiri. Dalam Python 3, sifat-sifat khas ini dinamakan semula untuk keserasian.
Nota | Python 2 | Python 3 |
---|---|---|
① | a_function.func_name | a_fungsi._Nama_ |
② | a_function.func_doc | a_fungsi._Doktor. |
③ | a_function.func_defaults | a_fungsi._default_ |
④ | a_function.func_dict | a_fungsi._Mengambil keputusan |
⑤ | a_function.func_closure | a_fungsi._penutupan_ |
⑥ | a_function.func_globals | a_fungsi._global_ |
⑦ | a_function.func_code | a_fungsi._kod_ |
1, sifat __name__ ((asli func_name) mengandungi nama fungsi. 2, _doc__ property ((asli funcdoc) mengandungi string dokumen (docstring) yang anda tentukan dalam kod sumber fungsi 3, _defaults__ property (~ original_func_defaults) adalah satu kumpulan elemen yang menyimpan parameter dengan nilai lalai. 4, _dict__ property ((asli func_dict) adalah ruang nama yang menyokong sifat fungsi apa sahaja. 5. sifat __closure__ (asli function_closure) adalah satu unsur yang terdiri daripada objek sel yang mengandungi pengikat fungsi terhadap pembolehubah bebas. 6. Sifat __globals__ adalah rujukan kepada ruang nama global modul, dan fungsi itu sendiri ditakrifkan dalam ruang nama ini. 7, _code__ property ((originalfunc_code) adalah objek kod yang mewakili badan fungsi yang telah disusun.
Dalam Python 2, objek fail mempunyai kaedah xreadlines (), yang mengembalikan satu iterator, satu baris membaca fail sekali. Ini sangat berguna dalam loop for. Malah, versi Python 2 kemudian menambah fungsi ini kepada objek fail itu sendiri.
Dalam Python 3, kaedah xreadlines tidak lagi boleh digunakan. 2to3 dapat menyelesaikan keadaan mudah, tetapi beberapa kes pinggir memerlukan campur tangan manusia.
Nota | Python 2 | Python 3 |
---|---|---|
① | untuk baris dalam a_file.xreadlines(): | untuk baris dalam file: |
② | untuk baris dalam a_file.xreadlines(5): | tiada perubahan (rusak) |
1, jika anda memanggil xreadlines tanpa parameter sebelumnya, 2to3 akan mengubahnya menjadi objek fail itu sendiri. Dalam Python 3, kod yang ditukar ini dapat melakukan kerja yang sama sebelum ini: membaca satu baris fail sekali, dan kemudian menjalankan putaran putaran for.
2. Jika anda sebelum ini menggunakan satu parameter (bilang baris yang 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:
Dalam Python 2, anda boleh mentakrifkan fungsi lambda tanpa nama ("anonymous lambda function") dengan menentukan bilangan elemen yang akan digunakan untuk parameter. Sebenarnya, penerjemah Python 2 akan menguraikan parameter ini menjadi parameter yang dinamakan ("named arguments"), dan anda boleh merujuk kepada mereka dalam fungsi lambda ("by name"). Dalam Python 3, anda masih boleh menyampaikan satu parameter sebagai parameter untuk fungsi lambda, tetapi penerjemah Python tidak akan menguraikannya sebagai parameter yang dinamakan ("named parameter").
Nota | 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 | tidak berubah |
1, jika anda telah menentukan fungsi lambda, ia menggunakan unsur yang mengandungi satu unsur sebagai parameter, di Python 3, ia akan ditukar kepada fungsi lambda yang mengandungi rujukan kepada x1[0]; x1 adalah skrip 2to3 yang dihasilkan secara automatik berdasarkan parameter nama dalam unsur asal. 2. Menggunakan satu susun atur yang mengandungi dua elemen (x, y) sebagai parameter, fungsi lambda ditukar kepada x_y, yang mempunyai dua parameter lokasi iaitu x_y[0] dan x_y[1]; Skrip 3, 2to3 bahkan boleh mengendalikan fungsi lambda yang menggunakan parameter nama susun atur sebagai parameternya. Kod hasil yang dihasilkan agak sukar dibaca, tetapi ia mempunyai kesan yang sama di Python 3 seperti kod asal di Python 2. 4, anda boleh mentakrifkan fungsi lambda yang menggunakan pelbagai parameter. Jika tiada kurung di sekeliling parameter, Python 2 akan menganggapnya sebagai fungsi lambda yang mengandungi beberapa parameter; dalam badan fungsi lambda ini, anda merujuk parameter ini dengan nama, seperti yang dilakukan dalam fungsi jenis lain. Senam ini masih berlaku di Python 3.
Dalam Python 2, kaedah kelas boleh diakses untuk menentukan objek kelas mereka (class object) dan juga untuk mengakses objek kaedah (method object) itu sendiri. im_self adalah objek contoh kelas; im_func adalah objek fungsi, im_class adalah kelas itu sendiri. Dalam Python 3, sifat-sifat ini dinamakan semula untuk mengikuti konvensyen penamaan sifat lain.
Nota | Python 2 | Python 3 |
---|---|---|
① | aClassInstance.aClassMethod.im_func | aClassInstance.aClassMethod._fungsi_ |
② | aClassInstance.aClassMethod.im_self | aClassInstance.aClassMethod._sendiri_ |
③ | aClassInstance.aClassMethod.im_class | aClassInstance.aClassMethod._sendiri_._kelas_ |
Dalam Python 2, anda boleh membuat kelas anda sendiri dan membolehkan mereka digunakan dalam konteks boolean. Sebagai contoh, anda boleh mencontohkan kelas ini dan menggunakan objek contoh ini dalam satu if statement. Untuk mencapai tujuan ini, anda mentakrifkan sesuatu yang istimewa.bukan sifar() kaedah, yang nilai pulangnya adalah True atau False, kaedah ini dipanggil apabila objek contoh berada dalam konteks pada bur. Dalam Python 3, anda masih boleh melakukan fungsi yang sama, tetapi nama kaedah khas ini menjadiBoole_()。
Nota | Python 2 | Python 3 |
---|---|---|
① | kelas A: def _bukan sifar(sendiri): lulus |
kelas A: def _Boole_(sendiri): lulus |
② | kelas A: def _bukan sifar(diri, x, y): lulus |
tiada perubahan |
1. Apabila anda menggunakan objek kelas dalam konteks Bur, Python 3 akan memanggil_Boole_(), dan bukan _bukan sifar(■■) 2. Walau bagaimanapun, jika anda mempunyai satu definisi yang menggunakan dua parameterbukan sifar() kaedah, skrip 2to3 akan mengandaikan kaedah yang anda tentukan mempunyai kegunaan lain dan oleh itu tidak mengubah kod.
Antara Python 2 dan Python 3, terdapat sedikit perubahan dalam tatabahasa yang menentukan bilangan oktal.
Nota | Python 2 | Python 3 |
---|---|---|
① | x = 0755 | x = 0o755 |
Oleh kerana bentuk bulat dan bulat telah disatukan, konstanta sys.maxint tidak lagi tepat. Tetapi kerana nilai ini masih berguna untuk keupayaan untuk mengesan platform tertentu, ia disimpan oleh Python 3 dan dinamakan semula sebagai sys.maxsize.
Nota | Python 2 | Python 3 |
---|---|---|
① | daripada sys importmaxint | daripada sys importmaxsize |
② | a_function ((sys.maxint) | a_function ((sys.maxsize) |
1,maxint menjadi maxsize. 2, semua sys.maxint menjadi sys.maxsize.
Dalam Python 2, anda boleh menggunakan fungsi global callable untuk memeriksa sama ada objek boleh dipanggil. Dalam Python 3, fungsi global ini dibatalkan. Untuk memeriksa sama ada objek boleh dipanggil, anda boleh memeriksa kaedah khas.Panggil_Apakah wujudnya?
Nota | Python 2 | Python 3 |
---|---|---|
① | boleh dipanggil ((apa-apa) | Tiada apa-apa, |
Dalam Python 2, fungsi global zip ((() boleh menggunakan mana-mana siri sebagai parameter, dan ia mengembalikan senarai yang terdiri daripada unsur-unsur. Satu unsur pertama mengandungi unsur pertama dari setiap siri; satu unsur kedua mengandungi unsur kedua dari setiap siri; dan seterusnya bergerak ke bawah. Dalam Python 3, zip ((() mengembalikan pengulangan, bukan senarai.
Nota | Python 2 | Python 3 |
---|---|---|
① | zip ((a, b, c) | senarai ((zip ((a, b, c)) |
② | d.join ((zip ((a, b, c)) | tiada perubahan |
Dalam bentuk yang paling mudah, anda boleh memulihkan fungsi sebelum fungsi zip dengan memanggil nilai pulangan fungsi zip yang dibungkus dengan list (), yang akan melintasi pengulangan yang mengembalikan fungsi zip (), dan kemudian mengembalikan senarai hasil yang ditunjukkan. Iterator yang mengembalikan zip dapat berfungsi dengan baik dalam persekitaran konteks yang telah melaluinya semua elemen siri (seperti panggilan kaedah join di sini); skrip 2to3 akan mengesan keadaan ini dan tidak mengubah kod anda.
Dalam Python 2, StandardError adalah semua kelas asas yang mempunyai kecacatan bawaan selain StopIteration, GeneratorExit, KeyboardInterrupt, dan SystemExit. Dalam Python 3, StandardError telah dihapuskan; Exception digunakan sebagai pengganti.
Nota | Python 2 | Python 3 |
---|---|---|
① | x = StandardError() | x = Pengecualian |
② | x = StandardError ((a, b, c) | x = Pengecualian ((a, b, c) |
Terdapat pelbagai parameter dalam modul types untuk membantu anda menentukan jenis objek. Dalam Python 2, ia mengandungi parameter yang mewakili semua jenis data asas, seperti dict dan int. Dalam Python 3, parameter ini telah dihapuskan. Hanya perlu diganti dengan nama jenis asas.
Nota | Python 2 | Python 3 |
---|---|---|
types.UnicodeType | str | |
types.StringType | byte | |
types.DictType | dikti | |
types.IntType | int | |
types.LongType | int | |
types.ListType | senarai | |
types.NoneType | jenis ((Tidak ada) | |
types.BooleanType | bool | |
types.BufferType | Memoriview | |
types.ClassType | jenis | |
types.ComplexType | kompleks | |
types.EllipsisType | jenis ((Ellips) | |
types.FloatType | mengambang | |
types.ObjectType | objek | |
types.NotImplementedType | jenis ((Tidak dilaksanakan) | |
types.SliceType | Slice | |
types.TupleType | Tumpukan | |
types.TypeType | jenis | |
types.XRangeType | julat |
Types.StringType dipetakan sebagai byte, bukan str, kerana string string dalam Python 2 sebenarnya hanya satu siri byte yang dienkodkan dengan beberapa watak.
Fungsi isinstance memeriksa sama ada objek adalah contoh kelas atau jenis tertentu. Dalam Python 2, anda boleh menghantar unsur yang terdiri daripada jenis kepada istance. Jika objek itu adalah jenis mana-mana dalam unsur, fungsi itu akan mengembalikan True. Dalam Python 3, anda masih boleh melakukan ini, tetapi tidak disyorkan untuk menggunakan jenis sebagai parameter untuk menghantar dua kali.
Nota | Python 2 | Python 3 |
---|---|---|
adalah contoh ((x, ((int,float,int)) | isinstance ((x, ((int,float)) |
Python 2 mempunyai dua jenis senar: senar yang dikodkan Unicode dan senar yang tidak dikodkan Unicode. Tetapi sebenarnya terdapat juga sejenis lain, iaitu basestring. Ia adalah jenis data abstrak yang merupakan superclass jenis str dan unicode. Ia tidak boleh dipanggil secara langsung atau dicontohkan, tetapi anda boleh menggunakannya sebagai parameter contoh untuk mengesan sama ada objek adalah senar Unicode atau bukan senar Unicode.
Nota | Python 2 | Python 3 |
---|---|---|
isinstance ((x, basestring) | isinstance ((x, str) |
Python 2.3 memperkenalkan modul itertools, yang mentakrifkan varian (varian) fungsi global zip, map, dan filter, yang jenis pulangnya adalah iterator, bukan senarai. Dalam Python 3, fungsi-fungsi varian ini dihapus kerana jenis pulangan fungsi global ini adalah iterator, jadi fungsi-fungsi varian dalam itertools ini dibatalkan.
Nota | Python 2 | Python 3 |
---|---|---|
① | itertools.izip ((a, b) | zip ((a, b) |
② | itertools.imap (a, b) | peta ((a, b) |
③ | itertools.ifilter ((a, b) | penapis ((a, b) |
④ | dari itertools import imap, izip, foo | dari itertools import foo |
1, menggunakan fungsi zip ((() global dan bukan itertools.izip ((() ⇒ 2、 menggunakan map (() dan bukannya itertools.imap (() ‖ 3,itertools.ifilter ((() menjadi filter ((() ▽ Modul 4, itertools masih wujud dalam Python 3, ia hanya tidak lagi mengandungi fungsi yang telah dipindahkan ke ruang nama global. Skrip 2to3 cukup pintar untuk membuang pernyataan import yang tidak lagi berguna, sambil mengekalkan integriti pernyataan import yang lain.
Pada masa ini, terdapat tiga pembolehubah yang boleh anda akses di dalam modul sys: sys.exc_type, sys.exc_value, sys.exc_traceback. Pada masa Python 1, ia sudah ada. Bermula pada Python 1.5, penggunaan ketiga-tiga pembolehubah ini tidak lagi disyorkan kerana sys.exc_info yang baru dikeluarkan, yang merupakan satu subset yang mengandungi semua tiga elemen di atas. Pada Python 3, ketiga-tiga pembolehubah ini akhirnya tidak lagi wujud; ini bermakna anda mesti menggunakan sys.exc_info.
Nota | 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, jika anda perlu menulis pemangkasan senarai yang melintasi unsur, anda tidak perlu menambahkan kurung di sekitar nilai unsur. Dalam Python 3, kurung-kurung ini diperlukan.
Nota | Python 2 | Python 3 |
---|---|---|
[i untuk dalam 1,2] | [i untuk iin(1,2)] |
Python 2 mempunyai fungsi yang dipanggil os.getcwd (), yang mengembalikan direktori kerja semasa sebagai satu baris (tidak dikodkan dalam Unicode). Oleh kerana sistem fail moden dapat menangani nama direktori yang dikodkan dengan berapa banyak watak, Python 2.3 memperkenalkan fungsi os.getcwdu (), fungsi os.getcwdu (), yang mengembalikan direktori kerja semasa dengan baris yang dikodkan dalam Unicode. Dalam Python 3, anda hanya memerlukan os.getcwd (), kerana hanya ada satu baris (jenis jenis Unicode).
Nota | Python 2 | Python 3 |
---|---|---|
os.getcwdu() | os.getcwd() |
Dalam Python 2, anda boleh mencipta metaclass dengan menentukan parameter metaclass dalam deklarasi kelas, atau menentukan sifat __metaclass__ pada peringkat kelas khas. Dalam Python 3, sifat __metaclass__ telah dibatalkan.
Nota | Python 2 | Python 3 |
---|---|---|
① | kelas C ((metaclass=PapayaMeta): lulus |
tidak berubah |
② | kelas Whip:Metaclass_= PapayaMeta | kelas Whip ((metaclass=PapayaMeta): lulus |
③ | kelas C ((Whipper, Beater): _Metaclass_= PapayaMeta |
kelas C ((Whipper,Beater,metaclass=PapayaMeta): lulus |
1. Mengisytiharkan parameter metaclass semasa mengisytiharkan kelas, yang berlaku di Python 2 dan Python 3, mereka sama. 2. Dalam definisi kelas menyatakan bahawa sifat __metaclass__ adalah sah di Python 2, tetapi tidak lagi sah di Python 3. 3, 2to3 dapat membina deklarasi kelas yang sah walaupun kelas ini mewarisi pelbagai kelas induk.
Penyelesaian yang disenaraikan di bawah tidak dianggap sebagai pembaikan sebenar. Maksudnya, mereka hanya perkara gaya kod dan tidak melibatkan kod itu sendiri. Tetapi pemaju Python mempunyai minat yang besar untuk menjadikan gaya kod selaras mungkin. Untuk itu, terdapat panduan rasmi yang khusus untuk menggambarkan gaya kod Python.
Dalam Python 2, satu-satunya cara untuk mentakrifkan set literal adalah dengan memanggil set (a_sequence); dalam Python 3 ini masih berlaku, tetapi menggunakan notasi literal baru: kurung besar adalah kaedah yang lebih jelas. Kaedah ini berfungsi selain daripada kurung kosong, kerana kamus juga menggunakan kurung besar, jadi {} menandakan kamus kosong, bukan satu set kosong.
Skrip 2to3 secara lalai tidak akan membetulkan set (() literal. Untuk menghidupkan ciri ini, senaraikan parameter -f set_literal semasa panggilan pada baris arahan 2to3.
Nota | Sebelumnya | Selepas |
---|---|---|
set (([1,2,3]) | {1,2,3} | |
set (((1,2,3)) | {1,2,3} | |
set (([i untuk iin a_sequence]) | {i untuk dalam urutan} |
Objek Python yang dilaksanakan dalam bahasa C boleh mengeluarkan antarmuka buffer yang membolehkan kod Python yang lain membaca dan menulis secara langsung pada satu butir memori. Ini terdengar kuat, tetapi ia juga menakutkan. Dalam Python 3, buffer dinamai semula sebagai memoryview. Perubahan sebenar lebih rumit, tetapi anda hampir dapat mengabaikan perbezaan ini.
Skrip 2to3 secara lalai tidak akan membetulkan fungsi buffer. Untuk menghidupkan fungsi ini, tentukan -f buffer parameter semasa panggilan pada baris arahan 2to3.
Nota | Sebelumnya | Selepas |
---|---|---|
x = buffer ((y) | x =memoryview ((y) |
Walaupun Python mempunyai keperluan yang ketat terhadap ruang untuk mengindent dan keluar, Python masih bebas untuk menggunakan ruang dalam aspek lain. Dalam senarai, unsur, kumpulan dan kamus, ruang boleh muncul di hadapan atau di belakang koma, ini tidak akan memberi kesan buruk. Walau bagaimanapun, manual gaya kod Python menyatakan bahawa tidak boleh ada ruang sebelum koma dan koma harus mengandungi ruang. Walaupun ini hanyalah kod pertimbangan estetika yang masih berfungsi dengan baik, ia boleh dilakukan di Python 2 dan Python 3, skrip 2to3 boleh melakukan pembaikan ini untuk anda berdasarkan piawaian manual.
Skrip 2to3 secara lalai tidak akan membetulkan ruang di sekitar koma. Untuk menghidupkan ciri ini, tentukan -f wscomma parameter semasa panggilan pada baris arahan 2to3.
Nota | Sebelumnya | Selepas |
---|---|---|
a, b | a, b | |
{a:b} | {a: b} |
Banyak amalan telah ditubuhkan di dalam komuniti Python. Terdapat beberapa contoh seperti sementara 1: gelung, yang bermula pada Python 1. (Python tidak mempunyai jenis bull yang benar-benar bermakna sehingga Python 2.3, jadi pemaju sebelum ini menggunakan penggantian 1 dan 0.)
Skrip 2to3 secara lalai tidak akan memperbaiki kebiasaan ini. Untuk menghidupkan ciri ini, senaraikan parameter -f idioms semasa panggilan pada baris arahan 2to3.
Nota | Sebelumnya | Selepas |
---|---|---|
sementara 1: do_stuff() |
sementara True: do_stuff() |
|
jenis ((x) == T | adalah contoh ((x, T) | |
jenis ((x) ialah T | adalah contoh ((x, T) | |
a_list = senarai ((a_sequence) | a_list = diurutkan (a_sequence) | |
a_list.sort() | Do_stuff (daftar) | |
Do_stuff (daftar) |
DibaharuiBlog CSDN
Mengenai cara menukar kod Python 2.x kepada kod Python 3.x. Cara menukar kod Python 2.x kepada kod Python 3.x
Ini tidak perlu dikatakan banyak jika hanya melibatkan beberapa fungsi, seperti print dan lain-lain.
Jika anda ingin mengubah kod anda sendiri, anda boleh melakukannya.
Versi Python 2.x, seperti Python 2.7.2 yang saya pasang, membawa beberapa alat berguna yang berkaitan selepas anda memuat turun dan memasang Windows.
其中一个叫做2to3.py, adalah alat yang digunakan untuk membantu anda melaksanakan, mengubah kod Python 2.x menjadi kod Python 3.x.
Ia terletak di: direktori akar pemasangan Python\Python27\Tools\Scripts\2to3.py
【如何利用2to3.py, melaksanakan menukar kod Python 2.x kepada kod Python 3.x Contohnya, saya mempunyai skrip Python 2.x:
D:\tmp\tmp_dev_root\python\python2_to_python3\34563264_data_from_site.py
Sekarang, saya mahu menukarnya kepada kod Python 3.x.
Anda boleh membuka cmd pada windows, mengarahkan ke bawah skrip yang ingin ditukar, dan kemudian menjalankan
D:\tmp\WordPress\DevRoot\Python27\Tools\Scripts\2to3.py -w 34563264_data_from_site.py
Jika anda berjaya menukar, hasil pelaksanaan yang sesuai adalah:
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> 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> <a href="#">sales@cinesysinc.com</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> 740 SW 21st Ave, Suite #310<br />
RefactoringTool: Files that were modified:
RefactoringTool: 34563264_data_from_site.py
Pada masa ini, anda boleh melihat asal 345636264_data_from_site.py, yang telah menjadi versi Python 3.x
FangBeiAdakah botvs menggunakan Python 2?
Pencipta Kuantiti - Impian KecilPelayan balas BotVS menggunakan versi Python 2.7, yang disokong untuk platform BotVS Python 2 dan Python 3.