Modifikasi Python 2.x.x dengan Python 3.x.x & Cara Mengubah Python 2.x.x menjadi Python 3.x.x

Penulis:Mimpi kecil, Dibuat: 2016-10-09 12:36:49, Diperbarui: 2017-10-11 10:18:05

Perbedaan, perubahan, dan perubahan tata bahasa Python 2 dan Python 3

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.

  • Pernyataan print

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= sebagai parameter kata kunci ke print. Dalam Python 2, Anda dapat melakukan hal yang sama dengan mengirim output ke sebuah pipa, misalnya sys.stderr. Dalam Python 3, Anda dapat melakukan hal yang sama dengan mengirim output ke printer sebagai nilai dari file parameter kata kunci.

  • String Unicode

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
Papaya Whip Papaya Whip
UrPapaya Whip\foo rPapaya Whip\foo

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.

  • Fungsi Unicode global

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)
  • panjang bulat

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.

  • Operator perbandingan <>

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.

  • Metode kelas kamus has_key ((()

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 ((Papaya Whip) Papaya Whip dalam kamus
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 +.

  • Metode kelas kamus untuk mengembalikan daftar

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 (()).

  • Modul yang diberi nama ulang atau disusun ulang

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.

  • http Di Python 3, beberapa modul HTTP yang terkait dikumpulkan menjadi satu paket terpisah, yaitu http.
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

  • Urllib Python 2 memiliki beberapa modul yang digunakan untuk menganalisis, mengkodekan, dan mendapatkan URL, tetapi modul-modul ini saling tumpang tindih seperti mouse. Pada Python 3, modul-modul ini direstrukturkan kembali dan dikumpulkan menjadi satu paket terpisah, urllib.
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))
  • dbm Semua klon DBM sekarang berada dalam satu paket terpisah, yaitu dbm. Jika Anda membutuhkan varian tertentu, seperti GNUDBM, Anda dapat mengimpor modul yang sesuai ke dalam paket dbm.
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
  • xmlrpc XML-RPC adalah metode ringan untuk melakukan panggilan RPC jarak jauh melalui protokol HTTP. Beberapa implementasi klien XML-RPC dan server XML-RPC sekarang dikombinasikan menjadi paket terpisah, yaitu xmlrpc.
Catatan Python 2 Python 3
Mengimpor xmlrpclib Import xmlrpc.client
mengimpor DocXMLRPCServer
mengimpor SimpleXMLRPCServer
Mengimpor xmlrpc.server
  • Modul lainnya

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.

  • Impor relatif dalam paket

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.

  • Metode iterator selanjutnya

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.

  • Filter fungsi global

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.

  • Fungsi global map (((

Seperti halnya perubahan filter (), fungsi map (), sekarang kembali ke sebuah iterator (Iterator).

Catatan Python 2 Python 3
peta ((a_function,PapayaWhip) daftar ((map ((a_function,PapayaWhip))
Peta ((Tidak ada,PapayaWhip) daftar ((Papaya Whip)
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.

  • Fungsi global reduce ((()

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)
  • Fungsi global apply ((()

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.

  • Fungsi global intern

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)
  • Eksekusi

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.

  • Pernyataan execfile

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 ((a_filename).read(),a_filename,exec))
  • repr (dengan tanda kutip)

Dalam Python 2, untuk mendapatkan string yang mewakili objek acak, ada cara untuk membungkus objek dalam countercitation (misalnyaxDalam 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)
`Papaya Whip + `2` repr ((PapayaWhip+ repr ((2))

1, ingat, x bisa menjadi apa saja sebuah kelas, fungsi, modul, tipe data dasar, dll. ==repr== fungsi dapat menggunakan parameter dari jenis apapun == 2, di Python 2, countercitation dapat diselipkan, yang menghasilkan ekspresi yang membingungkan namun efektif ini. 2to3 cukup cerdas untuk mengubah panggilan ini ke fungsi repr.

  • Try...except kalimat

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.

  • Raise kalimat

Dalam Python 3, ada sedikit perubahan dalam tata bahasa untuk membuang kesalahan kustom.

Catatan Python 2 Python 3
Angkat MyException tidak berubah
mengangkat MyException, pesan kesalahan mengangkat MyException (( error message)
mengangkat MyException,message error, a_traceback mengangkat MyException (ErrorMessage).with_traceback (A_traceback)
mengangkat pesan kesalahan 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.

  • Metode lemparan generator

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, error message) a_generator.throw(MyException(message error))
a_generator.throw (( error message) 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.

  • Fungsi global xrange (())

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 ().

  • Fungsi global raw_input (() dan input (())

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 ((prompt) input ((prompt)
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 ((().

  • Properti fungsi func_*

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.

  • Metode I/O xreadlines

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: _io.TextIOWrapper object has no attribute xreadlines. Anda dapat mengubah xreadlines secara manual menjadi readlines ().

  • Fungsi lambda yang menggunakan elemen, bukan beberapa parameter

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.

  • Atribut Metode Khusus

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_
  • Cara khusus __nonzero__

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.

  • Tipe delapan digit

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
  • sys.maxint

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.

  • Fungsi global callable (((

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, _telepon_’)
  • Fungsi global ((zip)

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.

  • Kesalahan Standar

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)
  • Konstan dalam modul types

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 global in instance

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))
  • tipe data basestring

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)
  • modul itertools

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.

  • sys.exc_type, sys.exc_value, sys.exc_traceback

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]
  • Menganalisis daftar elemen

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)]
  • Fungsi os.getcwdu ((()

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()
  • Meta-kelas

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.

  • Tentang Gaya Kode

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.

  • set (() literal (literal) (() eksplisit)

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}
  • Buffer fungsi global

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)
  • Ruang kosong di sekitar koma (jelas)

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}
  • Kebiasaan (Common idioms) (Keterangan)

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

Cara mengubah kode Python 2 menjadi kode Python 3

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

  • 1.自己手动转换

Ini tidak perlu dikatakan banyak jika hanya melibatkan beberapa fungsi, seperti print, dll.

Jika Anda ingin mengubah kode Anda sendiri, Anda bisa melakukannya.

  • 2.利用Python内置(Python脚本)工具,帮你自动转换

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>&nbsp;800.206.7886<br />
@@ -122,7 +122,7 @@
         foundWeb = eachItemSoup.find(attrs={"class":"web"});
         logging.debug("foundWeb=%s", foundWeb);
         if(foundWeb):
-            foundWebUni = unicode(foundWeb);
+            foundWebUni = str(foundWeb);
             logging.debug("foundWebUni=%s", foundWebUni);
 
             # <p class="web"><strong>e-mail:</strong>&nbsp;<a href="#">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>&nbsp;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.


Lebih banyak

FangBeiApa itu botvs Python 2?

Mimpi kecilBotVS menggunakan versi Python 2.7, yang didukung untuk platform BotVS Python 2 dan Python 3.