Hampir semua program Python 2 membutuhkan beberapa modifikasi untuk berjalan dengan baik di lingkungan Python 3. Untuk menyederhanakan proses konversi ini, Python 3 dilengkapi dengan skrip utilitas yang disebut 2to3 ("Utility Script"), yang akan mengambil file sumber program Python 2 Anda sebagai input dan kemudian secara otomatis mengubahnya ke bentuk Python 3. Studi kasus: Mengangkut chardet ke Python 3 ("porting chardet to Python 3) menjelaskan bagaimana menjalankan skrip ini, dan kemudian menunjukkan beberapa hal yang tidak dapat diperbaiki secara otomatis.
Dalam Python 2, print adalah sebuah pernyataan. Apa pun yang ingin Anda keluarkan, Anda bisa menempatkan mereka di belakang kata kunci print. Dalam Python 3, print adalah sebuah fungsi. Seperti fungsi lainnya, print membutuhkan Anda untuk menyampaikan apa yang ingin Anda keluarkan sebagai parameter.
Catatan | Python 2 | Python 3 |
---|---|---|
① | cetak | cetakan |
② | cetak 1 | cetakan ((1) |
③ | 1,2 cetak | cetakan ((1,2) |
④ | cetak 1,2, | print ((1,2,end= |
⑤ | print >>sys.stderr,1,2,3 | print ((1,2,3, file=sys.stderr) |
1, Untuk mengekspor baris kosong, Anda harus memanggil print tanpa parameter (((((((
Untuk mengekspor nilai yang terpisah, Anda dapat menggunakan nilai ini sebagai salah satu parameter print ().
3, Untuk output menggunakan dua nilai yang dipisahkan oleh ruang kosong, dengan dua parameter print ((() dapat disebut.
Contoh ini memiliki beberapa trik. Pada Python 2, jika Anda menggunakan koma sebagai akhir dari pernyataan print, maka hasil akan diisolasi dengan ruang kosong, dan kemudian akan diisolasi dengan ruang trailing, dan tidak menghasilkan carriage return. Pada Python 3, efek yang sama dapat dicapai dengan menyampaikan end=
Python 2 memiliki dua jenis string:String UnicodedanString Non-Unicode◎ Python 3 hanya memiliki satu tipe:String Unicode (bahasa Inggris: Unicode string)。
Catatan | Python 2 | Python 3 |
---|---|---|
① | ||
② | Ur |
r |
String Unicode di Python 2 adalah string biasa di Python 3, karena dalam Python 3 string selalu dalam bentuk Unicode. String asli Unicode (raw string) (dengan menggunakan string ini, Python tidak akan secara otomatis mengkonversi kebalik slope") juga diganti menjadi string biasa, karena di Python 3, semua string asli dienkode dalam Unicode.
Python 2 memiliki dua fungsi global yang dapat memaksa konversi objek ke dalam string: unicode ((() mengubah objek ke dalam string Unicode, dan str ((() mengubah objek ke dalam string non-Unicode. Python 3 hanya memiliki satu jenis string, yaitu string Unicode, sehingga str ((() berfungsi untuk melakukan semua fungsi.Fungsi unicode ((() tidak ada lagi di Python 3.)
Catatan | Python 2 | Python 3 |
---|---|---|
① | Unicode (apa saja) | Str (((apa pun) |
Python 2 memiliki tipe int dan long yang disiapkan untuk non-floating point numbers. Maksimal dari tipe int tidak dapat melebihi sys.maxint, dan maksimum ini terkait dengan platform. Integer panjang dapat didefinisikan dengan menambahkan L di akhir angka, yang jelas lebih besar dari kisaran angka yang diwakili oleh tipe int. Dalam Python 3, hanya ada satu tipe integer int, yang dalam kebanyakan kasus mirip dengan integer panjang di Python 2. Karena tidak ada integer dari dua jenis, tidak perlu menggunakan tata bahasa khusus untuk membedakannya.
Baca lebih lanjut: PEP 237: Unifikasi bentuk panjang dan bentuk bulat.
Catatan | Python 2 | Python 3 |
---|---|---|
① | x = 1000000000000L | x = 1000000000000 |
② | x = 0xFFFFFFFFFFFFL | x = 0xFFFFFFFFFF |
③ | panjang ((x) | int ((x) |
④ | tipe ((x) adalah panjang | tipe ((x) adalah int |
⑤ | isinstance ((x,panjang) | isinstance ((x,int) |
Dalam Python 2, integer decimal diganti dengan bilangan bulat biasa decimal di Python 3. Dalam Python 2, integer panjang 16 digit diganti dengan integer biasa 16 digit di Python 3. Pada Python 3, karena bentuk bulat tidak ada lagi, maka bentuk bulat tidak akan ada lagi.Fungsi long ((() alami juga tidak ada. Untuk memaksa konversi suatu variabel ke integer, fungsi int ((( dapat digunakan.Saya tidak tahu. Memeriksa apakah suatu variabel adalah integer, mendapatkan tipe datanya, dan membandingkannya dengan tipe int (tidak panjang). Anda juga dapat menggunakan fungsi istance (() untuk memeriksa tipe data; sekali lagi, int, bukan long, digunakan untuk memeriksa tipe integer.
Python 2 mendukung <> sebagai sinonim dari!=. Python 3 hanya mendukung!=, dan tidak lagi mendukung <>.
Catatan | Python 2 | Python 3 |
---|---|---|
① | jika x <> y: | Jika x! = y: |
② | jika x <> y <> z: | jika x!= y!= z: |
1, perbandingan sederhana. 2, perbandingan antara tiga nilai yang relatif kompleks.
Dalam Python 2, metode has_key (,) untuk objek kamus digunakan untuk menguji apakah kamus berisi kunci tertentu (); Python 3 tidak lagi mendukung metode ini.dalamOperatornya.
Catatan | Python 2 | Python 3 |
---|---|---|
① | a_dictionary.has_key (( |
|
② | a_dictionary.has_key ((x) atau a_dictionary.has_key ((y) | x dalam a_diksi atau y dalam a_diksi |
③ | 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 a_dictionary) |
1, bentuk yang paling sederhana. 2, operator or memiliki prioritas yang lebih rendah dari operator in, jadi tidak perlu menambahkan tanda kurung di sini. Di sisi lain, untuk alasan yang sama, prioritas yang lebih rendah dari in diperlukan untuk menambahkan tanda kurung. Perhatikan: kode di sini sangat berbeda dari baris sebelumnya. Python akan menginterpretasikan x atau y terlebih dahulu, dan mendapatkan hasil x (jika nilai x dalam konteks boolean benar) atau y. Kemudian Python memeriksa apakah hasil ini adalah kunci dari a_dictionary). Operator in memiliki prioritas yang lebih rendah dari operator +, sehingga bentuk ini dalam kode secara teknis tidak memerlukan tanda kurung, tetapi 2to3 masih ditambahkan. 5, bentuk ini pasti membutuhkan tanda kurung karena in memiliki prioritas yang lebih rendah dari +.
Dalam Python 2, banyak metode dictionary yang memiliki nilai balik sebagai daftar. Salah satu metode yang paling umum digunakan adalah keys, items, dan values. Dalam Python 3, semua metode tersebut memiliki nilai balik yang berubah menjadi dynamic view. Dalam beberapa konteks, perubahan ini tidak berdampak. Jika nilai balik dari metode tersebut langsung diteruskan ke fungsi lain, dan fungsi tersebut melintasi seluruh deret, maka nilai balik dari metode tersebut adalah daftar atau tampilan yang tidak berubah dan tidak menghasilkan apa-apa.
Catatan | Python 2 | Python 3 |
---|---|---|
① | a_dictionary.keys (() | daftar ((a_dictionary.keys()) |
② | a_dictionary.items (dalam bahasa Inggris) | daftar (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()) | Tidak ada perubahan |
1, menggunakan fungsi list ((() untuk mengubah nilai kembali keys ((() ke dalam daftar statis, karena alasan keamanan, 2to3 mungkin akan memberikan kesalahan. Kode seperti itu efektif, tetapi untuk menggunakan tampilan, itu agak kurang efisien. Anda harus memeriksa kode yang dikonversi untuk melihat apakah Anda pasti membutuhkan daftar, dan mungkin tampilan juga dapat melakukan pekerjaan yang sama. 2, ini adalah tampilan lain dari konversi metode (untuk item) ke daftar. Konversi metode 2to3 untuk nilai (untuk nilai) juga sama. 3, Pada Python 3 tidak lagi mendukung iterkeys. Jika perlu, gunakan iter untuk mengubah nilai balik keys menjadi iterator. 4, 2to3 dapat mengidentifikasi metode iterkeys yang digunakan dalam analisis daftar dan mengubahnya menjadi keys di Python 3. Metode ini dapat dilakukan karena tampilan iteratif. 5, 2to3 juga dapat mengidentifikasi bahwa nilai balik dari metode keys (() langsung ditransfer ke fungsi lain yang akan melintasi seluruh urutan, sehingga tidak perlu mengubah nilai balik keys (() ke daftar terlebih dahulu. Sebaliknya, fungsi min (()) akan dengan senang hati melintasi tampilan. Proses ini sama efektifnya untuk min ((), max ((), sum ((), tuple ((), setlist ((), sorted ((), any (() dan all (()).
Dari Python 2 ke Python 3, beberapa modul dari standar library telah diberi nama ulang. Beberapa modul yang saling terkait juga telah dikombinasikan atau disusun ulang untuk membuat hubungan ini lebih logis.
Catatan | Python 2 | Python 3 |
---|---|---|
① | mengimpor httplib | Import http.client |
② | Impor Cookie | mengimpor http.cookies |
③ | mengimpor cookielib | mengimpor http.cookiejar |
④ | mengimpor BaseHTTPServer mengimpor SimpleHTTPServer mengimpor CGIHttpServer |
Mengimpor http.server |
Modul http.client mengimplementasikan sebuah basis perpustakaan yang dapat digunakan untuk meminta sumber daya HTTP dan menganalisis tanggapan HTTP. Modul http.cookies menyediakan antarmuka Python untuk mengambil cookie yang dikirim melalui HTTP header Set-Cookie Browser populer biasanya menyimpan cookie dalam bentuk file pada disk, yang dapat dioperasikan oleh modul http.cookiejar. Modul http.server mengimplementasikan server HTTP dasar
Catatan | 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 |
④ | mengimpor robotparser | Import urllib.robotparser |
⑤ | dari urllib import FancyURLopener dari urllib import urlencode |
dari urllib.request import FancyURLopener dari urllib.parse import urlencode |
⑥ | dari urllib2 import Permintaan dari urllib2 import HTTPError |
dari urllib.request import Permintaan dari urllib.error import HTTPError |
Sebelumnya, modul urllib di Python 2 memiliki berbagai fungsi, termasuk urlopen untuk mendapatkan data, dan berguna untuk membagi URL menjadi bagian dari fungsi splittype, splithost, dan splituser. Dalam paket urllib baru, fungsi-fungsi ini diselenggarakan dengan lebih logis. 2to3 akan mengubah panggilan fungsi-fungsi ini untuk menyesuaikan dengan skema penamaan baru. Pada Python 3, modul urllib2 sebelumnya telah digabungkan ke dalam paket urllib. Pada saat yang sama, urllib2 akan menampilkan berbagai hal favorit Anda di modul urllib Python 3, seperti metode build_opener, objek permintaan, HTTPBasicAuthHandler, dan teman-teman. Modul urllib.parse di Python 3 berisi semua fungsi analisis dari modul urlparse di Python 2. Modul urllib.robotparse menganalisis file robots.txt. Kelas FancyURLopener yang menangani pengalihan HTTP dan kode status lainnya masih berlaku di modul urllib.request di Python 3. Fungsi urllencode telah dipindahkan ke urllib.parse. Objek permintaan masih valid di urllib.request, tetapi konstanta seperti HTTPError telah dipindahkan ke urllib.error. Apakah saya pernah menyebutkan bahwa 2to3 juga akan menulis ulang panggilan fungsi Anda? Misalnya, jika Anda mengimpor modul urllib ke dalam kode Python 2 dan memanggil urllib.urlopen () fungsi untuk mendapatkan data, 2to3 akan mengubah pernyataan impor dan panggilan fungsi pada saat yang sama.
Catatan | Python 2 | Python 3 |
---|---|---|
① | import urllib print urllib.urlopen ((("http://diveintopython3.org/’) membaca)) | import urllib.request, urllib.parse, urllib.error print ((urllib.request.urlopen)) "http://diveintopython3.org/’) membaca)) |
Catatan | Python 2 | Python 3 |
---|---|---|
① | import dbm | Import dbm.ndbm |
② | impor gdbm | impordbm.gnu |
③ | import dbhash | Import dbm.bsd |
④ | Import dumbdbm | Import dbm.dumb |
⑤ | mengimpor apapun yang | import dbm |
Catatan | Python 2 | Python 3 |
---|---|---|
① | Mengimpor xmlrpclib | Import xmlrpc.client |
② | mengimpor DocXMLRPCServer mengimpor SimpleXMLRPCServer |
Mengimpor xmlrpc.server |
Catatan | Python 2 | Python 3 |
---|---|---|
① | coba: import cStringIO sebagai StringIO kecuali ImportError: import StringIO |
Pengimpor |
② | try: import cPickle sebagai acar except ImportError: import acar |
acar impor |
③ | imporDibangun | impor bangunan |
④ | mengimpor copy_reg | impor copyreg |
⑤ | antrian impor | antrian impor |
⑥ | mengimpor SocketServer | import socketserver |
⑦ | mengimpor ConfigParser | import configparser |
⑧ | impor repr | import reprlib |
⑨ | perintah impor | subproses impor |
1, di Python 2, Anda biasanya melakukan ini dengan mencoba mengimpor cStringIO sebagai pengganti dari StringIO, dan jika gagal, mengimpor StringIO. Jangan lakukan ini di Python 3; modul io akan membantu Anda menangani hal ini. 2, di Python 2, mengimpor implementasi pickle tercepat juga merupakan cara yang berguna yang mirip dengan di atas. Di Python 3, modul pickle akan memprosesnya secara otomatis untuk Anda, jadi jangan lakukan lagi. 3. modul builtins berisi fungsi global, kelas, dan konstanta yang akan digunakan di seluruh bahasa Python. Sebuah fungsi yang didefinisikan ulang di modul builtins berarti bahwa fungsi global ini didefinisikan ulang di mana-mana. Modul copyreg menambahkan dukungan untuk modul pickle untuk tipe kustom pengguna yang didefinisikan dalam bahasa C. Modul queue 5 mengimplementasikan antrian produsen konsumen (multi-producer, multi-consumer queue). Modul socketserver menyediakan kelas dasar umum untuk implementasi berbagai server socket. 7. modul configparser digunakan untuk menganalisis profil INI-style. Modul reprlib mengimplementasikan kembali fungsi repr () dan menambahkan kontrol terhadap panjang string yang dinyatakan sebelum dipotong. 9. Subprocess module memungkinkan Anda membuat subprocess, terhubung ke pipa mereka, dan mengambil nilai pengembaliannya.
Paket adalah entitas tunggal yang terdiri dari sekumpulan modul yang terkait. Pada Python 2, Anda menggunakan import foo atau from foo import Bar untuk membuat referensi antar modul dalam paket yang sama.2解释器会先在当前目录里搜索foo.pyPada Python 3, proses ini sedikit berbeda. Python 3 tidak mencari di jalur saat ini terlebih dahulu, tetapi langsung mencari di jalur pencarian Python. Jika Anda ingin mengimpor satu modul dari paket ke modul lain dari paket, Anda perlu memberikan jalur relatif kedua modul secara eksplisit.
Jika Anda memiliki paket seperti ini, maka Anda memiliki beberapa file di dalam direktori yang sama:
Chardet/ Percayalah. ±-init.py Percayalah.+--konstan.py | +--mbcharsetprober.py | +--universaldetector.py
Sekarang anggaplah bahwa universal detector.py membutuhkan seluruh import constants.py.,另外还需要导入mbcharsetprober.py的一个类。你会怎样做?
Catatan | Python 2 | Python 3 |
---|---|---|
① | konstanta impor | dari konstanta.import |
② | dari mbcharsetprober import MultiByteCharSetProber | dari.mbcharsetprober mengimpor MultiByteCharsetProber |
1, Ketika Anda perlu mengimpor seluruh modul dari tempat lain dalam paket, gunakan sintaks baru dari.import.universaldetector.py) dan Anda ingin mengimpor file ((constants.pyDalam contoh ini, kedua file berada di direktori yang sama, sehingga menggunakan tanda baca tunggal. Anda juga dapat mengimpor dari direktori induk (dari... import anothermodule) atau dari direktori anak. Untuk mengimpor kelas atau fungsi tertentu dari modul lain ke ruang nama modul Anda, tambahkan jalur relatif di depan modul yang ingin diimpor, dan hapus garis miring terakhir (slash). Dalam contoh ini, mbcharsetprober.py dan universaldetector.py berada di direktori yang sama, jadi nama jalur relatif adalah tanda baca. Anda juga dapat mengimpor dari direktori induk (from... import anothermodule) atau dari direktori anak.
Pada Python 2, iterator memiliki metode next (), yang digunakan untuk mengembalikan item berikutnya dalam urutan. Pada Python 3, ini juga bekerja, tetapi sekarang ada fungsi global baru next (), yang menggunakan iterator sebagai parameter.
Catatan | Python 2 | Python 3 |
---|---|---|
① | anIterator.next ((() | next ((Aniterator) |
② | a_function_that_returns_an_iterator().next() | next ((a_function_that_returns_an_iterator()) |
③ | kelas A: def next ((self): lulus |
kelas A: def _Selanjutnya.(sendiri): melewati |
④ | kelas A: def next ((self, x, y): lulus |
Tidak ada perubahan |
⑤ | next = 42 untuk an_iterator dalam a_sequence_of_iterators: an_iterator.next() |
next = 42 untuk an_iterator dalam a_sequence_of_iterators: an_iterator._Selanjutnya.() |
Contoh yang paling sederhana adalah bahwa Anda tidak lagi memanggil metode next ((() pada sebuah iterator, tetapi Anda sekarang mengirimkan iterator itu sendiri sebagai parameter ke fungsi global next ((() ‒ Jika Anda memiliki nilai yang dikembalikan sebagai fungsi iterator, panggil fungsi ini dan sampaikan hasilnya sebagai parameter ke fungsi next. Jika Anda mengasumsikan kelas Anda sendiri dan menggunakannya sebagai iterator, di Python 3 Anda dapat menggunakan metode khusus untuk mendefinisikan.Selanjutnya.Saya tidak tahu apa yang terjadi. 4, jika kelas yang Anda tentukan hanya memiliki next (), maka ia akan menggunakan satu atau lebih parameter, 2to3 tidak akan menggerakkannya saat dijalankan. Kelas ini tidak dapat digunakan sebagai iterator karena metode next () nya memiliki parameter. 5, ini agak rumit. Jika Anda kebetulan memiliki variabel lokal yang disebut next, dalam Python 3 prioritasnya akan lebih tinggi daripada fungsi global next. Dalam hal ini, Anda perlu memanggil metode khusus iterator.Selanjutnya.() untuk mendapatkan elemen berikutnya dalam deret tersebut. Atau, Anda juga dapat merombak kode agar nama variabel lokal ini tidak disebut next, tetapi 2to3 tidak akan melakukan hal itu untuk Anda.
Dalam Python 2, metode filter (,) mengembalikan sebuah daftar, yang diperoleh dengan memeriksa setiap item dalam urutan dengan fungsi yang mengembalikan nilai True atau False. Dalam Python 3, filter ()) mengembalikan sebuah iterator, bukan lagi daftar.
Catatan | Python 2 | Python 3 |
---|---|---|
① | filter ((a_function, a_sequence) | daftar ((filter ((a_function, a_sequence)) |
② | daftar ((filter ((a_function, a_sequence)) | Tidak ada perubahan |
③ | filter ((Tidak ada, a_sequence) | [i untuk iin a_sequence jika i] |
④ | untuk i dalam filter ((None, a_sequence): | Tidak ada perubahan |
⑤ | [i untuk filter iin ((a_function, a_sequence) ] | Tidak ada perubahan |
Dalam kasus yang paling sederhana, 2to3 akan menggunakan fungsi list ((() untuk membungkus filter ((), dan fungsi list (()) akan melintasi parameternya dan mengembalikan daftar. Namun, jika panggilan filter ((() telah di bungkus oleh list ((), 2to3 tidak akan memprosesnya lagi, karena dalam hal ini tidak penting apakah nilai yang dikembalikan filter ((() adalah iterator. Untuk mengolah filter (None,...) yang khusus, 2to3 akan mengubah panggilan ini dari persamaan tata bahasa ke analisis daftar. 4, karena loop for akan melintasi seluruh urutan, tidak perlu melakukan modifikasi lebih lanjut. 5, sama seperti di atas, tidak perlu dilakukan modifikasi, karena daftar akan disortir melintasi seluruh urutan, dan bahkan jika filter kembali ke iterator, itu masih bisa bekerja dengan baik seperti filter sebelumnya kembali ke daftar.
Seperti halnya perubahan filter (), fungsi map (), sekarang kembali ke sebuah iterator (Iterator).
Catatan | Python 2 | Python 3 |
---|---|---|
① | peta ((a_function, |
daftar ((map ((a_function, |
② | Peta ((Tidak ada, |
daftar (( |
③ | peta ((lambda x: x+1,range ((42)) | [x+1 untuk x dalam kisaran ((42)] |
④ | untuk i dalam peta (a_function, a_sequence): | Tidak ada perubahan |
⑤ | [i untuk dalam peta ((a_function,a_sequence) ] | Tidak ada perubahan |
1, mirip dengan filter ((), dalam kasus yang paling sederhana, 2to3 akan menggunakan fungsi list (() untuk melampirkan panggilan map (()). 2、 Untuk map khusus ((None,...) sintaksis, mirip dengan filter ((None,...) 2to3 akan mengubahnya menjadi panggilan setara dengan list ((). 3, jika parameter pertama dari map () adalah fungsi lambda, 2to3 akan mengubahnya secara setara ke dalam perhitungan daftar. 4, tidak perlu diubah untuk loop for yang melintasi seluruh deret. 5, sekali lagi, tidak perlu dilakukan modifikasi di sini karena daftar akan diulas sepanjang urutan, bahkan jika nilai yang dikembalikan oleh map ((() adalah iterator dan bukan daftar, itu akan bekerja dengan baik.
Pada Python 3, fungsi reduce (), yang telah dihapus dari ruang nama global, sekarang ditempatkan di modul fucntools.
Catatan | Python 2 | Python 3 |
---|---|---|
① | mengurangi ((a, b, c) | dari alat fungsi impor mengurangi mengurangi ((a, b, c) |
Python 2 memiliki fungsi global yang disebut apply ((), yang menggunakan fungsi f dan daftar [a, b, c] sebagai parameter dan mengembalikan nilai f ((a, b, c)). Anda juga dapat melakukan hal yang sama dengan langsung memanggil fungsi ini dan menambahkan tanda bintang ((*) sebagai parameter yang diteruskan ke daftar. Dalam Python 3, fungsi apply (() tidak ada lagi; Anda harus menggunakan tanda bintang.
Catatan | 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) |
④ | menerapkan ((aModule.a_function, a_list_of_args) | aModule.a_function ((*a_list_of_args) |
1, dalam bentuk yang paling sederhana, fungsi dapat dipanggil dengan menambahkan tanda bintang di depan daftar parameter (seperti [a, b, c]). 2, Dalam Python 2, fungsi apply dapat membawa tiga parameter: sebuah fungsi, daftar parameter, dan kamus nama argumen. Dalam Python 3, Anda dapat menambahkan tanda bintang di depan daftar parameter.), dengan menambahkan dua bintang ((**) sebelum parameter nama kamus untuk mendapatkan efek yang sama. 3, operator + digunakan di sini sebagai fungsi dari daftar yang terhubung, dan memiliki prioritas lebih tinggi dari operator, jadi tidak perlu menambahkan tanda kurung tambahan di sekitar a_list_of_args + z. Skripsi 4, 2to3 cukup cerdas untuk mengkonversi panggilan aplikasi yang rumit, termasuk panggilan fungsi impor dari modul.
Dalam Python 2, Anda dapat menggunakan fungsi intern untuk membatasi fungsi intern pada suatu string untuk mencapai optimasi kinerja. Dalam Python 3, fungsi intern dipindahkan ke modul sys.
Catatan | Python 2 | Python 3 |
---|---|---|
① | intern ((aString) | sys.intern ((aString) |
Seperti halnya pernyataan print yang berubah menjadi fungsi dalam Python 3, pernyataan exec juga demikian. Fungsi tersebut menggunakan string yang berisi kode Python acak sebagai parameter dan kemudian mengeksekusi seperti pernyataan atau ekspresi eksekusi. Fungsi ini mirip dengan eval, tetapi lebih kuat dan lebih rumit.
Catatan | Python 2 | Python 3 |
---|---|---|
① | kode execString | exec ((codeString) |
② | exec codeString di ruang nama global | exec ((codeString, a_global_namespace) |
③ | kode execString di ruang nama global, ruang nama lokal | exec ((codeString, a_global_namespace,a_local_namespace) |
1, dalam bentuk yang paling sederhana, karena exec ((() sekarang adalah fungsi, bukan kalimat, 2to3 akan mengikat kode dalam bentuk string ini dengan tanda kurung. 2. Pernyataan exec dalam Python 2 dapat menentukan ruang nama, dan kode akan dijalankan dalam ruang pribadi yang terdiri dari objek global ini. Python 3 juga memiliki fungsi seperti itu; Anda hanya perlu menyampaikan ruang nama ini sebagai parameter kedua ke fungsi exec (). 3. Lebih menarik lagi, pernyataan exec di Python 2 juga dapat menentukan ruang nama lokal (misalnya variabel yang dinyatakan dalam suatu fungsi). Dalam Python 3, fungsi exec (misalnya variabel yang dinyatakan dalam suatu fungsi) juga memiliki fungsi seperti itu.
Seperti pernyataan exec sebelumnya, pernyataan execfile di Python 2 juga dapat menggunakan string seperti menjalankan kode Python; berbeda dengan exec yang menggunakan string, sedangkan execfile menggunakan file. Dalam Python 3, pernyataan execfile telah dihapus. Jika Anda benar-benar ingin menjalankan kode Python dari sebuah file (tetapi Anda tidak ingin mengimpornya), Anda dapat melakukannya dengan membuka file ini, membaca isinya, dan kemudian memanggil fungsi global (compile) (Python interpreter memaksa kode dikompilasi, dan kemudian memanggil fungsi exec baru).
Catatan | Python 2 | Python 3 |
---|---|---|
① | execfile (a_filename) | exec ((compile ((open (( |
Dalam Python 2, untuk mendapatkan string yang mewakili objek acak, ada cara untuk membungkus objek dalam countercitation (misalnyax
Dalam Python 3, kemampuan ini masih ada, tetapi Anda tidak dapat lagi menggunakan tanda kutip untuk mendapatkan string yang dinyatakan. Anda perlu menggunakan fungsi global repr ().
Catatan | Python 2 | Python 3 |
---|---|---|
① | `x` | repr ((x) |
② | ` |
repr (( |
1, ingat, x bisa menjadi apa saja
Syntax untuk menangkap keanehan mungkin sedikit berbeda dari Python 2 ke Python 3.
Catatan | Python 2 | Python 3 |
---|---|---|
① | try: import mymodule except ImportError, e pass |
coba: import mymodule kecuali ImportError sebagai e: lulus |
② | try: import mymodule except (RuntimeError, ImportError), e pass |
try: import mymodule except (RuntimeError, ImportError) sebagai e: pass |
③ | coba: import mymodule kecuali ImportError: pass |
Tidak ada perubahan |
④ | coba: import mymodule kecuali: pass |
Tidak ada perubahan |
1, dibandingkan dengan Python 2 yang menambahkan koma setelah tipe yang tidak biasa, Python 3 menggunakan kata kunci baru, as. 2, kata kunci as juga dapat digunakan untuk menangkap beberapa jenis kelainan sekaligus. 3. Jika Anda menangkap suatu keanehan, tetapi tidak ingin mengakses objek keanehan itu sendiri, tata bahasa Python 2 dan Python 3 adalah sama. 4. Demikian pula, jika Anda menggunakan metode yang aman (fallback) untuk menangkap semua keanehan, sintaksis Python 2 dan Python 3 sama. Jika tidak, program dapat menangkap kesalahan seperti KeyboardInterrupt (jika pengguna menekan Ctrl-C untuk menghentikan program), sehingga membuat debugging lebih sulit.
Dalam Python 3, ada sedikit perubahan dalam tata bahasa untuk membuang kesalahan kustom.
Catatan | Python 2 | Python 3 |
---|---|---|
① | Angkat MyException | tidak berubah |
② | mengangkat MyException, |
mengangkat MyException (( |
③ | mengangkat MyException, |
mengangkat MyException (ErrorMessage).with_traceback (A_traceback) |
④ | mengangkat |
tidak didukung |
1. membuang kesalahan yang tidak membawa kesalahan yang disesuaikan oleh pengguna, dalam bentuk yang paling sederhana, sintaks tidak berubah. 2, perubahan yang jelas terjadi ketika Anda ingin membuang suatu keanehan dengan pesan kesalahan kustom pengguna. Python 2 menggunakan koma untuk memisahkan jenis keanehan dan pesan kesalahan; Python 3 menyampaikan pesan kesalahan sebagai parameter ke jenis keanehan. 3. Python 2 mendukung sintaksis yang lebih kompleks untuk membuang suatu keanehan dengan stack trace yang disesuaikan pengguna. 4, di Python 2, Anda dapat membuang suatu kelainan tanpa kelas yang aneh, hanya satu pesan yang aneh. Dalam Python 3, bentuk ini tidak lagi didukung. 2to3 akan memperingatkan Anda bahwa tidak dapat memperbaiki sintaks ini secara otomatis.
Pada Python 2, generator memiliki metode throw (throw) ─ memanggil a_generator.throw (throw) ─ yang akan melemparkan suatu keanehan saat generator dihentikan, dan kemudian mengembalikan nilai berikutnya yang diperoleh oleh fungsi generator. Pada Python 3, fungsi ini masih tersedia, tetapi sedikit berbeda secara tata bahasa.
Catatan | Python 2 | Python 3 |
---|---|---|
① | a_generator.throw ((MyException) | Tidak ada perubahan |
② | a_generator.throw ((MyException, |
a_generator.throw(MyException( |
③ | a_generator.throw (( |
tidak didukung |
1, dalam bentuk yang paling sederhana, generator melemparkan keanehan tanpa pesan kesalahan yang disesuaikan oleh pengguna. Dalam hal ini, tidak ada perubahan sintaksis dari Python 2 ke Python 3. 2. Jika generator membuang suatu keanehan dengan pesan kesalahan yang disesuaikan pengguna, Anda perlu menyampaikan string pesan kesalahan ini ke kelas keanehan untuk menginstansikannya. 3. Python 2 juga mendukung throwing exceptions with only exceptional messages. Python 3 tidak mendukung sintaks ini, dan 2to3 akan menampilkan pesan peringatan yang memberitahu Anda bahwa Anda perlu memperbaiki kode ini secara manual.
Dalam Python 2, ada dua cara untuk mendapatkan angka dalam kisaran tertentu: range (), yang mengembalikan daftar, dan range (), yang mengembalikan sebuah iterator. Dalam Python 3, range (), yang mengembalikan iterator, xrange (), tidak ada lagi.
Catatan | Python 2 | Python 3 |
---|---|---|
① | xrange ((10) | rentang ((10) |
② | a_list = range ((10) | a_list = list ((range)) |
③ | [i untuk dalam xrange ((10)] | [i untuk kisaran dalam ((10) ] |
④ | untuk i dalam kisaran ((10)): | Tidak ada perubahan |
⑤ | jumlah ((range ((10) | Tidak ada perubahan |
1, dalam kasus yang paling sederhana, 2to3 akan mengubah xrange (x) menjadi range (x). 2, jika kode Python 2 Anda menggunakan range (), 2to3 tidak tahu apakah Anda membutuhkan daftar, atau apakah iterator berjalan juga. Untuk menghindari kesalahan, 2to3 mungkin akan menggunakan list (), yang memaksa nilai kembali dari range () menjadi jenis daftar. 3. Jika ada fungsi xrange ((() dalam perkalian daftar, tidak perlu mengubah nilai pengembaliannya menjadi daftar, karena perkalian daftar juga berlaku untuk iterator. 4 ∞, dengan cara yang sama, loop for juga bekerja pada iterator, jadi tidak ada yang berubah di sini. 5, fungsi sum () dapat bekerja pada iterator, jadi 2to3 juga tidak melakukan modifikasi di sini. Sama seperti metode dictionary yang mengembalikan nilai sebagai view () dan bukan lagi sebagai daftar, ini juga berlaku untuk min (), max (), sum (), list (), tuple (), set (), sorted (), any (), and all ().
Python 2 memiliki dua fungsi global yang digunakan pada baris perintah untuk meminta input pengguna. Yang pertama disebut input, yang menunggu pengguna untuk memasukkan ekspresi Python dan kemudian mengembalikan hasil. Yang kedua disebut raw_input, yang mengembalikan apa yang dimasukkan pengguna. Ini sangat membingungkan bagi pemula, dan ini secara luas dianggap sebagai saus daging bahasa Python.
Catatan | Python 2 | Python 3 |
---|---|---|
① | raw_input() | input ()) |
② | raw_input (( |
input (( |
③ | input ()) | Evaluasi (Input) |
Dalam bentuk yang paling sederhana, raw_input (() diganti dengan input (()). 2, Pada Python 2, fungsi raw_input (() dapat menentukan sebuah petunjuk sebagai parameter. Pada Python 3 fungsi ini dipertahankan. Jika Anda benar-benar ingin meminta pengguna untuk memasukkan ekspresi Python, hasil perhitungan dapat dilakukan dengan memanggil fungsi input ((() dan memberikan nilai kembali ke eval ((().
Dalam Python 2, kode dalam fungsi dapat mengakses sifat khusus dari fungsi itu sendiri. Dalam Python 3, sifat khusus ini dinamai ulang untuk konsistensi.
Catatan | Python 2 | Python 3 |
---|---|---|
① | a_function.func_name | a_fungsi._Nama_ |
② | a_function.func_doc | a_fungsi._Dok. |
③ | a_function.func_defaults | a_fungsi._default_ |
④ | a_function.func_dict | a_fungsi._Mengatakan |
⑤ | a_function.func_closure | a_fungsi._Penutupan |
⑥ | a_function.func_globals | a_fungsi._global_ |
⑦ | a_function.func_code | a_fungsi._Kode_ |
1, atribut __name__ ((asli func_name) berisi nama fungsi. 2, __doc__ property (yang asli functiondoc) berisi string dokumen (docstring) yang Anda tentukan dalam kode sumber fungsi Atribut __defaults__ adalah suatu elemen yang menyimpan parameter default. Atribut __dict__ adalah ruang nama yang mendukung atribut fungsi acak. Atribut __closure__ adalah suatu unsur dari objek cell yang berisi pengikat fungsi terhadap variabel bebas. Atribut __globals__ adalah referensi ke ruang nama global modul, dan fungsi itu sendiri didefinisikan di ruang nama tersebut. Atribut __code__ adalah sebuah objek kode yang mewakili fungsi yang dikompilasi.
Pada Python 2, objek file memiliki metode xreadlines (), yang mengembalikan satu iterator, satu baris membaca file sekali. Hal ini sangat berguna dalam loop for. Bahkan, versi Python 2 kemudian menambahkan fitur ini ke objek file itu sendiri.
Dalam Python 3, metode xreadlines tidak lagi tersedia. 2to3 dapat menyelesaikan situasi sederhana, tetapi beberapa kasus tepi membutuhkan intervensi manual.
Catatan | Python 2 | Python 3 |
---|---|---|
① | untuk baris di a_file.xreadlines(): | untuk baris di file: |
② | untuk baris di a_file.xreadlines(5): | Tidak ada perubahan (rusak) |
1, jika Anda sebelumnya memanggil xreadlines tanpa parameter, 2to3 akan mengubahnya menjadi objek file itu sendiri. Dalam Python 3, kode yang dikonversi ini dapat melakukan pekerjaan yang sama sebelumnya: membaca satu baris file sekali, dan kemudian melakukan loop yang berputar untuk.
2. Jika sebelumnya Anda menggunakan parameter (jumlah baris yang dibaca) untuk memanggil xreadlines (), 2to3 tidak dapat menyelesaikan konversi dari Python 2 ke Python 3 untuk Anda, maka kode Anda akan gagal dengan cara ini: AttributeError:
Dalam Python 2, Anda dapat mendefinisikan fungsi lambda anonim (anonymous lambda function) yang memungkinkan fungsi ini untuk menerima lebih dari satu parameter dengan menentukan jumlah elemen dari komponen sebagai parameter. Sebenarnya, penerjemah Python 2 menguraikan komponen ini menjadi parameter yang diberi nama (named arguments), dan Anda kemudian dapat merujuknya ke dalam fungsi lambda (named arguments). Dalam Python 3, Anda masih dapat menyampaikan suatu komponen sebagai parameter dari fungsi lambda, tetapi penerjemah Python tidak akan merumuskannya menjadi parameter yang diberi nama (named arguments). Anda perlu merujuk setiap parameter melalui indeks posisi (positional index).
Catatan | 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 |
Jika Anda telah mendefinisikan fungsi lambda, yang menggunakan elemen yang berisi satu elemen sebagai parameter, di Python 3 ini akan dikonversi menjadi lambda yang berisi referensi ke x1[0]; x1 adalah skrip 2to3 yang dibuat secara otomatis berdasarkan parameter nama dalam elemen asli. 2, menggunakan dua elemen (x, y) sebagai parameter, fungsi lambda diubah menjadi x_y, yang memiliki dua parameter posisi, yaitu x_y[0] dan x_y[1]; Skripsi 3, 2to3 bahkan dapat menangani fungsi lambda yang menggunakan parameter nama nesting sebagai parameternya. Kode hasil yang dihasilkan agak sulit dibaca, tetapi ini memiliki efek yang sama di Python 3 dengan kode asli di Python 2. 4, Anda dapat mendefinisikan fungsi lambda yang menggunakan beberapa parameter. Jika tidak ada tanda kurung di sekitar parameter, Python 2 akan menganggapnya sebagai fungsi lambda yang berisi beberapa parameter; dalam tubuh fungsi lambda ini, Anda merujuk parameter-parameter ini dengan nama, seperti yang dilakukan pada fungsi tipe lain.
Dalam Python 2, metode kelas dapat diakses untuk mendefinisikan objek kelas mereka, dan juga untuk mengakses objek metode 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 diberi nama ulang untuk mengikuti perjanjian penamaan sifat lain.
Catatan | Python 2 | Python 3 |
---|---|---|
① | aClassInstance.aClassMethod.im_func | aClassInstance.aClassMethod._fungsi_ |
② | aClassInstance.aClassMethod.im_self | aClassInstance.aClassMethod._diri sendiri. |
③ | aClassInstance.aClassMethod.im_class | aClassInstance.aClassMethod._diri sendiri.._kelas_ |
Di Python 2, Anda dapat membuat kelas Anda sendiri dan membuat mereka dapat digunakan dalam konteks boolean. Misalnya, Anda dapat menginstansifikasi kelas dan menggunakan objek contoh ini dalam sebuah pernyataan if. Untuk mencapai tujuan ini, Anda mendefinisikan sebuah khusus.bukan nol_Metode () yang dikembalikan dengan nilai True atau False, metode ini akan dipanggil ketika objek contoh berada dalam konteks boolean. Dalam Python 3, Anda masih dapat melakukan fungsi yang sama, tetapi nama metode khusus ini berubah.Bool_()。
Catatan | Python 2 | Python 3 |
---|---|---|
① | kelas A: def _bukan nol_(self): lulus |
kelas A: def _Bool_(self): lulus |
② | kelas A: def _bukan nol_(diri, x, y): lulus |
Tidak ada perubahan |
1, ketika menggunakan sebuah objek kelas dalam konteks boolean, Python 3 akan memanggil_Bool_(), bukanbukan nol_(Terjemahan Bahasa Inggris) Tapi jika Anda memiliki definisi yang menggunakan dua parameter.bukan nol_Metode 2to3 akan mengasumsikan bahwa metode yang Anda tentukan memiliki kegunaan lain, sehingga tidak akan mengubah kode.
Antara Python 2 dan Python 3, ada sedikit perubahan dalam tata bahasa yang mendefinisikan bilangan oktal.
Catatan | Python 2 | Python 3 |
---|---|---|
① | x = 0755 | x = 0o755 |
Karena bentuk bulat dan bulat telah diintegrasikan, konstanta sys.maxint tidak lagi akurat. Namun karena nilai ini masih berguna untuk kemampuan mendeteksi platform tertentu, ia dipertahankan oleh Python 3 dan diberi nama ulang sebagai sys.maxsize.
Catatan | Python 2 | Python 3 |
---|---|---|
① | dari sys importmaxint | dari sys importmaxsize |
② | a_function ((sys.maxint) | a_function ((sys.maxsize) |
1, maxint menjadi maxsize. 2, semua sys.maxint menjadi sys.maxsize.
Pada Python 2, Anda dapat menggunakan fungsi global callable (callable) untuk memeriksa apakah suatu objek dapat dipanggil (callable, misalnya fungsi). Pada Python 3, fungsi global ini dibatalkan. Untuk memeriksa apakah suatu objek dapat dipanggil, metode khusus dapat diperiksa.telepon_Ada banyak hal yang harus diperhatikan.
Catatan | Python 2 | Python 3 |
---|---|---|
① | bisa dipanggil (apa saja) | Tidak ada, |
Dalam Python 2, fungsi global zip ((() dapat digunakan sebagai parameter dari beberapa urutan, yang mengembalikan daftar yang terdiri dari elemen. Bagian pertama berisi elemen pertama dari setiap urutan; bagian kedua berisi elemen kedua dari setiap urutan; kemudian ditarik ke bawah. Dalam Python 3, zip ((() mengembalikan sebuah iterator, bukan daftar.
Catatan | Python 2 | Python 3 |
---|---|---|
① | zip ((a, b, c) | daftar ((zip ((a, b, c)) |
② | d.bergabung ((zip ((a, b, c)) | Tidak ada perubahan |
Dalam bentuk yang paling sederhana, Anda dapat memulihkan fungsi sebelumnya dengan memanggil nilai balik dari fungsi list ((() yang dibungkus zip (((), dan fungsi list ((() akan melintasi ider yang mengembalikan fungsi zip ((() ini, dan kemudian mengembalikan daftar hasil yang ditunjukkan. Dalam konteks yang sudah melintasi semua elemen dalam suatu deret (misalnya panggilan metode join di sini), ider yang mengembalikan zip dapat bekerja dengan baik. Skrip 2to3 akan mendeteksi hal-hal ini dan tidak akan mengubah kode Anda.
Dalam Python 2, StandardError adalah semua sub-kelas built-in yang tidak normal kecuali StopIteration, GeneratorExit, KeyboardInterrupt, dan SystemExit. Dalam Python 3, StandardError telah dihapus; diganti dengan Exception.
Catatan | Python 2 | Python 3 |
---|---|---|
① | x =StandardError (() | x = Pengecualian |
② | x =StandardError ((a, b, c) | x = Pengecualian (a, b, c) |
Berbagai konstanta dalam modul types dapat membantu Anda menentukan tipe suatu objek. Pada Python 2, ini berisi konstanta yang mewakili semua tipe data dasar, seperti dict dan int. Pada Python 3, konstanta ini telah dihapus.
Catatan | Python 2 | Python 3 |
---|---|---|
types.UnicodeType | str | |
types.StringType | byte | |
types.DictType | Dict | |
types.IntType | int | |
types.LongType | int | |
types.ListType | daftar | |
types.NoneType | jenis ((Tidak ada) | |
types.BooleanType | bool | |
types.BufferType | memoryview | |
types.ClassType | jenis | |
types.ComplexType | kompleks | |
types.EllipsisType | tipe ((Ellipsis) | |
types.FloatType | mengambang | |
types.ObjectType | objek | |
types.NotImplementedType | tipe ((Tidak diimplementasikan) | |
types.SliceType | Slice | |
types.TupleType | berganda | |
types.TypeType | jenis | |
types.XRangeType | rentang |
Types.StringType dipetakan sebagai byte, bukan str, karena string string di Python 2 sebenarnya adalah urutan byte yang dienkode dengan beberapa karakter.
Fungsi isinstance memeriksa apakah suatu objek adalah contoh dari suatu kelas atau tipe tertentu. Pada Python 2, Anda dapat menyampaikan suatu unsur yang terdiri dari tipe ke instance. Jika objek tersebut adalah salah satu jenis dalam unsur, fungsi tersebut akan mengembalikan True. Pada Python 3, Anda masih dapat melakukan hal ini, tetapi tidak disarankan untuk menggunakan jenis sebagai parameter untuk menyampaikan dua kali.
Catatan | Python 2 | Python 3 |
---|---|---|
adalah instance ((x, ((int,float,int)) | isinstance ((x, ((int,float)) |
Python 2 memiliki dua jenis string: string yang dienkode Unicode dan string yang tidak dienkode Unicode. Namun sebenarnya ada juga jenis lain, yaitu basestring. Ini adalah tipe data abstrak yang merupakan superclass dari str dan unicode. Ini tidak dapat dipanggil langsung atau di-instansiasi, tetapi Anda dapat menggunakannya sebagai parameter untuk memeriksa apakah suatu objek adalah string Unicode atau non-Unicode.
Catatan | Python 2 | Python 3 |
---|---|---|
isinstance ((x, basestring) | isinstance ((x, str) |
Python 2.3 memperkenalkan modul itertools, yang mendefinisikan varian (varian) dari fungsi global (zip), map (map), filter (filter) yang tipe pengembaliannya adalah iterator, bukan daftar. Pada Python 3, karena tipe pengembalian fungsi global ini adalah iterator, fungsi-fungsi variabel dalam itertools ini dibatalkan.
Catatan | Python 2 | Python 3 |
---|---|---|
① | itertools.izip (a, b) | zip ((a, b) |
② | itertools.imap (a, b) | peta (a, b) |
③ | itertools.ifilter ((a, b) | filter (a, b) |
④ | dari itertools impor imap, izip, foo | dari itertools impor foo |
1, menggunakan fungsi zip global, bukan itertools.izip. 2、 menggunakan map (() dan bukan itertools.imap (() ‖ 3 、itertools.ifilter() menjadi filter() ‖ Modul ini masih ada di Python 3, hanya saja tidak lagi berisi fungsi yang telah dipindahkan ke ruang nama global. Skrip 2to3 cukup cerdas untuk menghapus pernyataan impor yang tidak lagi berguna, sementara menjaga integritas pernyataan impor lainnya.
Pada saat menangani keanehan, ada tiga variabel yang dapat Anda akses di modul sys: sys.exc_type, sys.exc_value, sys.exc_traceback. Pada kenyataannya, ini sudah ada di era Python 1.
Catatan | 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] |
Di Python 2, jika Anda ingin menulis sebuah analisis daftar yang melintasi sebuah elemen, Anda tidak perlu menambahkan tanda kurung di sekitar nilai elemen. Di Python 3, tanda kurung ini diperlukan.
Catatan | Python 2 | Python 3 |
---|---|---|
[i untuk 1,2] | [i untuk iin(1,2)] |
Python 2 memiliki fungsi yang disebut os.getcwd (), yang mengembalikan direktori kerja saat ini sebagai string (tidak terenkode dalam Unicode). Karena sistem file modern dapat menangani nama direktori yang dapat mengenkode berapa pun karakternya, Python 2.3 memperkenalkan fungsi os.getcwdu (), yang mengembalikan direktori kerja saat ini dengan string yang dienkode dalam Unicode. Dalam Python 3, karena hanya ada satu string (jenis Unicode), Anda hanya perlu os.getcwd ().
Catatan | Python 2 | Python 3 |
---|---|---|
os.getcwdu ((() | os.getcwd() |
Dalam Python 2, Anda dapat membuat metaclass dengan mendefinisikan parameter metaclass dalam deklarasi kelas, atau dengan mendefinisikan atribut __metaclass__ pada tingkat kelas khusus. Dalam Python 3, atribut __metaclass__ telah dihapus.
Catatan | 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, menyatakan parameter metaclass saat menyatakan kelas, yang berlaku di Python 2 dan Python 3, mereka sama. 2, dalam definisi kelas menyatakan bahwa atribut __metaclass__ berlaku di Python 2, tetapi tidak berlaku lagi di Python 3. 3, 2to3 dapat membangun deklarasi kelas yang valid, bahkan jika kelas ini mewarisi dari beberapa kelas induk.
Perbaikan yang tercantum di bawah ini pada dasarnya tidak merupakan perbaikan yang sebenarnya. Artinya, mereka hanya hal-hal yang berkaitan dengan gaya kode dan tidak berkaitan dengan esensi kode. Namun, pengembang Python memiliki minat yang sangat besar dalam membuat gaya kode sejalan mungkin. Untuk itu, ada buku panduan resmi yang khusus menggambarkan gaya kode Python.
Di Python 2, satu-satunya cara untuk mendefinisikan sebuah set literal adalah dengan memanggil set a. Di Python 3, ini masih berlaku, tetapi menggunakan notasi literal baru: tanda kurung besar adalah cara yang lebih jelas. Metode ini berlaku di luar himpunan kosong, karena kamus juga menggunakan tanda kurung besar, sehingga {} menunjukkan kamus kosong, bukan himpunan kosong.
Skripsi 2to3 secara default tidak memperbaiki set (() literal. Untuk mengaktifkan fitur ini, pilih parameter -f set_literal saat memanggil 2to3 pada baris perintah.
Catatan | Sebelumnya | Setelah |
---|---|---|
set (([1,2,3]) | {1,2,3} | |
set (((1,2,3)) | {1,2,3} | |
set (([i untuk iin a_sequence]) | {i for iin a_sequence} |
Objek Python yang diimplementasikan dalam bahasa C dapat mengekspor sebuah buffer interface yang memungkinkan kode Python lain untuk membaca dan menulis ke memori secara langsung. (Ini terdengar sangat kuat, tetapi juga mengerikan.) Pada Python 3, buffer dinamai ulang sebagai memoryview.
Skripsi 2to3 secara default tidak memperbaiki fungsi buffer (). Untuk mengaktifkan fungsi ini, pilih parameter -f buffer saat memanggil 2to3 pada baris perintah.
Catatan | Sebelumnya | Setelah |
---|---|---|
x = buffer ((y) | x = memoriview (y) |
Meskipun Python memiliki persyaratan yang ketat untuk ruang yang digunakan untuk menyusut dan keluar (indenting dan outdenting), Python masih bebas untuk menggunakan ruang dalam hal lain. Dalam daftar, modul, himpunan, dan kamus, ruang dapat muncul di depan atau di belakang koma, yang tidak akan berdampak buruk. Namun, Python Code Style Guide menyatakan bahwa tidak boleh ada ruang di depan koma, koma harus berisi ruang.
Skripsi 2to3 secara default tidak memperbaiki ruang di sekitar koma. Untuk mengaktifkan fitur ini, pilih parameter -f wscomma saat memanggil 2to3 pada baris perintah.
Catatan | Sebelumnya | Setelah |
---|---|---|
a, b | a, b | |
{a:b} | {a: b} |
Banyak praktik yang telah dibangun di komunitas Python. Beberapa contohnya adalah while 1: loop, yang berasal dari Python 1. (Python tidak memiliki jenis bull yang benar-benar berarti sampai Python 2.3, sehingga pengembang sebelumnya menggunakan penggantian 1 dan 0.)
Skripsi 2to3 secara default tidak memperbaiki konvensi ini. Untuk mengaktifkan fitur ini, pilih parameter -f idioms saat memanggil 2to3 pada baris perintah.
Catatan | Sebelumnya | Setelah |
---|---|---|
sementara 1: do_stuff() |
sementara True: do_stuff() |
|
tipe ((x) == T | adalah contoh ((x, T) | |
tipe ((x) adalah T | adalah contoh ((x, T) | |
a_list = list ((a_sequence) | a_list = disortir (a_sequence) | |
a_list.sort (() | Do_stuff (Daftar) | |
Do_stuff (Daftar) |
Dikirim olehBlog CSDN
Pada bagian ini, kita akan membahas tentang cara mengubah kode Python 2.x menjadi kode Python 3.x. Cara mengubah kode Python 2.x ke kode Python 3.x
Ini tidak perlu dikatakan banyak jika hanya melibatkan beberapa fungsi, seperti print, dll.
Jika Anda ingin mengubah kode Anda sendiri, Anda bisa melakukannya.
Versi Python 2.x, seperti Python 2.7.2 yang saya instal, datang dengan beberapa alat yang berguna setelah diunduh dan diinstal di windows.
其中一个叫做2to3.py, yang digunakan untuk membantu Anda mengimplementasikan, mengkonversi kode Python 2.x ke kode Python 3.x.
Ini berada di: direktori root instalasi Python \Python27\Tools\Scripts\2to3.py
【如何利用2to3.py, mengimplementasikan untuk mengubah kode Python 2.x ke kode Python 3.x Sebagai contoh, saya memiliki skrip Python 2.x:
D:\tmp\tmp_dev_root\python\python2_to_python3\34563264_data_from_site.py
Sekarang, saya ingin mengubahnya menjadi kode Python 3.x.
Anda dapat membuka cmd di windows, mengarahkan ke bawah skrip yang ingin dikonversi, dan kemudian menjalankan
D:\tmp\WordPress\DevRoot\Python27\Tools\Scripts\2to3.py -w 34563264_data_from_site.py
Jika sukses, maka hasil yang akan dieksekusi 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 saat ini, Anda dapat melihat bahwa 345636264_data_from_site.py telah menjadi versi Python 3.x.
FangBeiApa itu botvs Python 2?
Penemu Kuantitas - Mimpi KecilBotVS menggunakan versi Python 2.7, yang didukung untuk platform BotVS Python 2 dan Python 3.