Hampir semua program Python 2 membutuhkan beberapa modifikasi untuk berjalan dengan baik di lingkungan Python 3. Untuk mempermudah proses konversi, 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.
Dalam Python 2, print adalah sebuah kalimat. Apa pun yang ingin Anda keluarkan, Anda bisa melakukannya dengan menempatkannya 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 argumen.
Notes | Python 2 | Python 3 |
---|---|---|
① | print() | |
② | print 1 | print(1) |
③ | print 1,2 | print(1,2) |
④ | print 1,2, | print(1,2,end=’ ‘) |
⑤ | print >>sys.stderr,1,2,3 | print(1,2,3, file=sys.stderr) |
Python 2 memiliki dua jenis string:Senar UnicodeDanString non-UnicodePython 3 hanya memiliki satu jenis:Senar Unicode。
Notes | Python 2 | Python 3 |
---|---|---|
① | u’PapayaWhip’ | ‘PapayaWhip’ |
② | ur’PapayaWhip\foo’ | r’PapayaWhip\foo’ |
String Unicode di Python 2 adalah string biasa di Python 3, karena string di Python 3 selalu dalam bentuk Unicode 。 Unicode original string ((raw string) ((Python tidak akan secara otomatis menterjemahkan backslash dengan menggunakan string ini”“) juga digantikan dengan string biasa, karena di Python 3, semua string asli dikodekan dalam Unicode。
Python 2 memiliki dua fungsi global untuk memaksakan konversi objek ke dalam string: unicode ((() untuk konversi objek ke dalam string Unicode, dan str ((() untuk konversi objek ke dalam string non-Unicode. Python 3 hanya memiliki satu jenis string, string Unicode, sehingga fungsi str ((() dapat melakukan semua fungsi tersebut.Fungsi unicode ((() tidak ada lagi di Python 3.)
Notes | Python 2 | Python 3 |
---|---|---|
① | unicode(anything) | str(anything) |
Python 2 memiliki tipe int dan long untuk non-floating point. Maksimum tipe int tidak dapat melebihi sys.maxint, dan nilai maksimum ini relevan dengan platform. Anda dapat mendefinisikan integer panjang dengan menambahkan L di akhir angka, yang jelas lebih luas daripada jumlah yang ditunjukkan oleh tipe int.
Baca lebih lanjut: PEP 237: Unifikasi bentuk bulat dan panjang.
Notes | Python 2 | Python 3 |
---|---|---|
① | x = 1000000000000L | x = 1000000000000 |
② | x = 0xFFFFFFFFFFFFL | x = 0xFFFFFFFFFFFF |
③ | long(x) | int(x) |
④ | type(x) is long | type(x) is int |
⑤ | isinstance(x,long) | isinstance(x,int) |
Integer panjang desimal di Python 2 diganti dengan integer biasa desimal di Python 3. Integer panjang enam belas digit di Python 2 diganti dengan integer biasa enam belas digit di Python 3. Dalam Python 3, karena bentuk bulat panjang tidak ada lagi, kita dapat menggunakan bentuk bulat panjang untuk mengubah bentuk bulat panjang menjadi bentuk bulat panjang.Fungsi long ((() yang asli juga tidak ada. Untuk memaksakan konversi suatu variabel ke integer, dapat digunakan fungsi int ((()。 Memeriksa apakah suatu variabel adalah integer, mendapatkan tipe datanya, dan membandingkannya dengan tipe int ((bukan long)). Anda juga bisa menggunakan fungsi ininstance (() untuk memeriksa tipe data; untuk menekankan lagi, gunakan int, bukan long, untuk memeriksa tipe integer ▽.
Python 2 mendukung <> sebagai sinonim dengan !=. Python 3 hanya mendukung!=, tidak lagi mendukung <>.
Notes | Python 2 | Python 3 |
---|---|---|
① | if x <> y: | if x != y: |
② | if x <> y<> z: | if x != y!= z: |
1 , hanya membandingkan. 2. Perbandingan antara tiga nilai yang relatif kompleks.
Dalam Python 2, dictionary object has_key ((() metode untuk menguji apakah kamus berisi kunci tertentu (((key)。 Python 3 tidak lagi mendukung metode ini。 Anda perlu menggunakaninOperator
Notes | Python 2 | Python 3 |
---|---|---|
① | a_dictionary.has_key(‘PapayaWhip’) | ‘PapayaWhip’ in a_dictionary |
② | a_dictionary.has_key(x) or a_dictionary.has_key(y) | x in a_dictionary or y in a_dictionary |
③ | a_dictionary.has_key(x or y) | (x or y) in a_dictionary |
④ | a_dictionary.has_key(x + y) | (x + y) in a_dictionary |
⑤ | x + a_dictionary.has_key(y) | x + (y in a_dictionary) |
Di Python 2, banyak metode dictionary yang dikembalikan sebagai list. Di antara metode yang paling umum digunakan adalah keys, items, dan values. Di Python 3, semua metode di atas dikembalikan sebagai dynamic view. Dalam beberapa konteks, perubahan ini tidak berpengaruh. Jika metode tersebut dikembalikan langsung ke fungsi lain, dan fungsi tersebut akan menjelajahi seluruh urutan, maka metode yang dikembalikan adalah list atau view dan tidak akan menghasilkan apa-apa.
Notes | Python 2 | Python 3 |
---|---|---|
① | a_dictionary.keys() | list(a_dictionary.keys()) |
② | a_dictionary.items() | list(a_dictionary.items()) |
③ | a_dictionary.iterkeys() | iter(a_dictionary.keys()) |
④ | [i for iin a_dictionary.iterkeys()] | [i for iin a_dictionary.keys()] |
⑤ | min(a_dictionary.keys()) | no change |
Dari Python 2 ke Python 3, beberapa modul dalam standar kueri telah diberi nama baru. Beberapa modul yang saling terkait juga telah digabungkan atau disusun ulang untuk membuat hubungan ini lebih logis.
Notes | Python 2 | Python 3 |
---|---|---|
① | import httplib | import http.client |
② | import Cookie | import http.cookies |
③ | import cookielib | import http.cookiejar |
④ | import BaseHTTPServer import SimpleHTTPServer import CGIHttpServer |
import http.server |
Modul http.client mengimplementasikan sebuah perpustakaan dasar yang dapat digunakan untuk meminta sumber daya HTTP dan menganalisis respon HTTP. Modul http.cookies menyediakan sebuah antarmuka Python untuk mendapatkan cookie yang dikirim melalui header HTTP Set-Cookie Browser yang umum digunakan menyimpan cookie dalam bentuk file pada disk, yang dapat dioperasikan oleh modul http.cookiejar. Modul http.server mengimplementasikan server HTTP dasar
Notes | Python 2 | Python 3 |
---|---|---|
① | import urllib | import urllib.request urllib.parse,urllib.error |
② | import urllib2 | import urllib.request urllib.error |
③ | import urlparse | import urllib.parse |
④ | import robotparser | import urllib.robotparser |
⑤ | from urllib import FancyURLopener from urllib import urlencode |
from urllib.request import FancyURLopener from urllib.parse import urlencode |
⑥ | from urllib2 import Request from urllib2 import HTTPError |
from urllib.request import Request from urllib.error import HTTPError |
Sebelumnya, modul urllib di Python 2 memiliki berbagai macam fungsi, termasuk urlopen () untuk mendapatkan data, dan juga berguna untuk membagi URL menjadi bagian-bagiannya. Fungsi splittype () splithost () dan splituser () Di dalam paket urllib baru, fungsi-fungsi ini diselenggarakan dengan lebih logis. 2to3 akan memodifikasi panggilan fungsi-fungsi ini untuk menyesuaikan dengan skema penamaan baru. Di Python 3, modul urllib2 sebelumnya diintegrasikan ke dalam paket urllib. Di saat yang sama, semua hal favorit Anda di urllib2 akan muncul secara konsisten di modul urllib Python 3, seperti build_Opener () metode, Request object, HTTPBasicAuthHandler dan friends。 Modul urllib.parse di Python 3 berisi semua fungsi parsing dari modul urlparse asli di Python 2. Modul urllib.robotparse menguraikan file robots.txt. Kelas FancyURLopener yang menangani pengalihan HTTP dan kode status lainnya masih berlaku di modul urllib.request di Python 3. Fungsi .urlencode () telah dipindahkan ke .urllib.parse . Request object masih valid di urllib.request, tetapi konstanta seperti HTTPError telah dipindahkan ke urllib.error. Apakah saya menyebutkan bahwa 2to3 juga akan menulis ulang panggilan fungsi Anda? Sebagai contoh, jika Anda mengimpor modul urllib ke dalam kode Python 2 dan memanggil fungsi urllib.urlopen (()) untuk mendapatkan data, 2to3 akan mengubah kalimat import dan panggilan fungsi pada saat yang sama.
Notes | Python 2 | Python 3 |
---|---|---|
① | import urllib print urllib.urlopen(’http://diveintopython3.org/‘).read() | import urllib.request, urllib.parse, urllib.error print(urllib.request.urlopen(’http://diveintopython3.org/‘).read()) |
Notes | Python 2 | Python 3 |
---|---|---|
① | import dbm | import dbm.ndbm |
② | import gdbm | import dbm.gnu |
③ | import dbhash | import dbm.bsd |
④ | import dumbdbm | import dbm.dumb |
⑤ | import anydbm import whichdb |
import dbm |
Notes | Python 2 | Python 3 |
---|---|---|
① | import xmlrpclib | import xmlrpc.client |
② | import DocXMLRPCServer import SimpleXMLRPCServer |
import xmlrpc.server |
Notes | Python 2 | Python 3 |
---|---|---|
① | try: import cStringIO as StringIO except ImportError: import StringIO |
import io |
② | try: import cPickle as pickle except ImportError: import pickle |
import pickle |
③ | import _builtin_ | import builtins |
④ | import copy_reg | import copyreg |
⑤ | import Queue | import queue |
⑥ | import SocketServer | import socketserver |
⑦ | import ConfigParser | import configparser |
⑧ | import repr | import reprlib |
⑨ | import commands | import subprocess |
Paket adalah satu entitas yang terdiri dari sekelompok modul yang terkait. Dalam Python 2, untuk melakukan referensi antar modul dalam paket yang sama, Anda akan menggunakan import foo atau from foo import Bar. Interpreter Python 2 akan mencari foo.py di direktori saat ini dan kemudian mencari di jalur pencarian Python ((sys.path). Proses ini sedikit berbeda dalam Python 3.
Misalkan Anda memiliki beberapa file dalam satu direktori, seperti:
chardet/ | +–init.py | +–constants.py | +–mbcharsetprober.py | +–universaldetector.py
Sekarang misalkan universaldetector.py membutuhkan seluruh impor constants.py, dan juga perlu mengimpor sebuah kelas dari mbcharsetprober.py. Bagaimana Anda akan melakukannya?
Notes | Python 2 | Python 3 |
---|---|---|
① | import constants | from .import constants |
② | from mbcharsetprober import MultiByteCharSetProber | from .mbcharsetprober import MultiByteCharsetProber |
Pada Python 2, iterator memiliki metode next (), yang digunakan untuk mengembalikan elemen berikutnya dalam urutan tersebut. Ini juga berlaku di Python 3, tetapi sekarang ada fungsi global baru next (), yang menggunakan iterator sebagai argumen.
Notes | Python 2 | Python 3 |
---|---|---|
① | anIterator.next() | next(anIterator) |
② | a_function_that_returns_an_iterator().next() | next(a_function_that_returns_an_iterator()) |
|③|class A:
def next(self):
pass|class A:
def next(self):
pass|
|④|class A:
def next(self, x, y):
pass|no change |
|⑤|next = 42
for an_iterator in a_sequence_of_iterators:
an_iterator.next()|next = 42
for an_iterator in a_sequence_of_iterators:
an_iterator.next() |
1 , contoh paling sederhana, Anda tidak lagi memanggil metode next (() dari sebuah iterator, sekarang Anda memberikan iterator itu sendiri sebagai parameter ke fungsi global next ((() }}.
2. Jika Anda memiliki nilai yang dikembalikan adalah fungsi iterator, panggil fungsi ini dan kirimkan hasilnya sebagai parameter ke fungsi next ().
3. jika Anda mengartikan kelas Anda sendiri, dan kemudian menggunakannya sebagai iterator, di Python 3, Anda dapat menggunakan metode khusus dengan mendefinisikannext() untuk mencapai.
4. Jika Anda mendefinisikan sebuah kelas yang memiliki satu atau lebih argumen next (), maka kelas tersebut tidak akan bergerak saat 2 to 3 dijalankan. Kelas ini tidak dapat digunakan sebagai iterator karena metode next () memiliki argumen.
5. Ini agak rumit. Jika Anda kebetulan memiliki variabel lokal yang disebut next, di Python 3 prioritasnya lebih tinggi dari fungsi global next ((() }}. Dalam hal ini, Anda perlu memanggil metode khusus iterator.next() untuk mendapatkan elemen berikutnya dari urutan tersebut。(atau, Anda juga dapat menyusun ulang kode sehingga nama variabel lokal tidak disebut next, tetapi 2to3 tidak akan melakukan hal ini untuk Anda。)
Di Python 2, metode filter() mengembalikan daftar yang diperoleh dengan fungsi yang mengembalikan nilai True atau False untuk setiap elemen dalam urutan. Di Python 3, fungsi filter() mengembalikan iterator, bukan lagi daftar.
Notes | Python 2 | Python 3 |
---|---|---|
① | filter(a_function, a_sequence) | list(filter(a_function, a_sequence)) |
② | list(filter(a_function, a_sequence)) | no change |
③ | filter(None, a_sequence) | [i for iin a_sequence if i] |
④ | for i in filter(None, a_sequence): | no change |
⑤ | [i for iin filter(a_function, a_sequence)] | no change |
Dalam kasus yang paling sederhana, 2 to 3 akan membungkus filter dengan fungsi list (), yang akan menelusuri parameternya dan mengembalikan sebuah daftar. 2 , Namun, jika filter() panggilan sudah terisi oleh paket list(), 2to3 tidak akan memprosesnya lagi, karena dalam hal ini tidak penting apakah nilai yang dikembalikan filter() adalah iterator. Untuk mengatasi sintaks khusus filter ((None, …) ini, 2 to 3 akan mengubah panggilan ini dari sintaks setara ke analisis daftar. 4. Karena loop for akan berjalan sepanjang urutan, maka tidak perlu lagi melakukan modifikasi. 5. Sama seperti di atas, tidak perlu dilakukan modifikasi, karena analisis daftar akan berjalan sepanjang urutan, bahkan jika filter () mengembalikan sebuah iterator, itu masih bisa bekerja seperti filter () yang sebelumnya mengembalikan daftar.
Seperti perubahan yang dilakukan oleh filter, fungsi map sekarang mengembalikan iterator. Dalam Python 2, ia mengembalikan sebuah daftar.
Notes | Python 2 | Python 3 |
---|---|---|
① | map(a_function,‘PapayaWhip’) | list(map(a_function,‘PapayaWhip’)) |
② | map(None,‘PapayaWhip’) | list(‘PapayaWhip’) |
③ | map(lambda x: x+1,range(42)) | [x+1for x in range(42)] |
④ | for i in map(a_function, a_sequence): | no change |
⑤ | [i for iin map(a_function,a_sequence)] | no change |
1 , mirip dengan filter ((), dalam kasus yang paling sederhana, 2to3 akan menggunakan fungsi list (() untuk membungkus panggilan map ((). 2. Untuk sintaks khusus map ((None, …), seperti filter ((None, …), 2to3 akan mengubahnya menjadi panggilan setara dengan menggunakan list ((). Jika parameter pertama map () adalah fungsi lambda, maka 2to3 akan mengubahnya secara ekuivalen ke dalam analisis daftar. 4. Tidak perlu melakukan perubahan untuk loop for yang akan menjelajahi seluruh urutan. 5. Sekali lagi, tidak perlu melakukan modifikasi di sini, karena analisis daftar akan berjalan sepanjang urutan, bahkan jika nilai yang dikembalikan map () adalah iterator dan bukan daftar, itu akan bekerja dengan baik.
Pada Python 3, fungsi reduce ((() telah dihapus dari namespace global dan sekarang ditempatkan di dalam modul fucntools。
Notes | Python 2 | Python 3 |
---|---|---|
① | reduce(a, b, c) | from functools import reduce reduce(a, b, c) |
Python 2 memiliki fungsi global yang disebut apply (), yang menggunakan fungsi f dan sebuah daftar.[a, b, c] sebagai argumen, yang dikembalikan adalah f ((a, b, c) . Anda juga dapat menambahkan tanda bintang di depan daftar dengan memanggil fungsi ini secara langsung*) sebagai parameter untuk melakukan hal yang sama. Dalam Python 3, fungsi apply ()) tidak lagi ada; harus menggunakan tanda bintang.
Notes | Python 2 | Python 3 |
---|---|---|
① | apply(a_function, a_list_of_args) | a_function(*a_list_of_args) |
② | apply(a_function, a_list_of_args, a_dictionary_of_named_args) | a_function(*a_list_of_args,**a_dictionary_of_named_args) |
③ | apply(a_function, a_list_of_args+ z) | a_function(*a_list_of_args+ z) |
④ | apply(aModule.a_function, a_list_of_args) | aModule.a_function(*a_list_of_args) |
1 , bentuk yang paling sederhana, dapat dilakukan dengan daftar parameter ((seperti[a, b, c]) sebelum menambahkan tanda bintang untuk memanggil fungsi。 yang setara dengan fungsi apply ((() di Python 2。 Pada Python 2, sebuah fungsi apply ((() sebenarnya dapat memiliki 3 argumen: sebuah fungsi, sebuah daftar argumen, dan sebuah kamus nama argumen (dictionary of named arguments). Pada Python 3, Anda dapat menambahkan sebuah tanda bintang di depan daftar argumen ((), tambahkan dua tanda bintang di depan argumen penamaan kamus ((**Ini adalah salah satu cara untuk mencapai efek yang sama. 3. Operator + digunakan sebagai fungsi untuk menghubungkan daftar, dan memiliki prioritas lebih tinggi dari operator, jadi tidak perlu menambahkan tanda kurung tambahan di sekitar a_list_of_args + z. Skrip 2 to 3 cukup cerdas untuk mengubah panggilan apply () yang rumit, termasuk fungsi yang disebut di modul impor.
Di Python 2, Anda dapat menggunakan fungsi intern () untuk membatasi fungsi intern () pada string untuk mencapai optimasi kinerja. Di Python 3, fungsi intern () dipindahkan ke modul sys.
Notes | Python 2 | Python 3 |
---|---|---|
① | intern(aString) | sys.intern(aString) |
Sama seperti kalimat print menjadi sebuah fungsi di Python 3, kalimat exec pun demikian. Fungsi。exec() menggunakan string yang berisi kode Python apapun sebagai argumen, lalu mengeksekusi string tersebut seperti mengeksekusi kalimat atau ekspresi.
Notes | Python 2 | Python 3 |
---|
|①|exec codeString|exec(codeString) |②|exec codeString in a_global_namespace|exec(codeString, a_global_namespace)| |③|exec codeString in a_global_namespace, a_local_namespace|exec(codeString, a_global_namespace,a_local_namespace)| 1, dalam bentuk yang paling sederhana, karena exec (() sekarang adalah sebuah fungsi, bukan sebuah pernyataan, 2to3 akan mengelilingi kode dalam bentuk string ini dengan tanda kurung. 2. Exec statement di Python 2 dapat menentukan namespace, dan kode akan dijalankan di ruang pribadi yang terdiri dari objek global. Python 3 juga memiliki fungsi seperti itu; Anda hanya perlu menyampaikan namespace ini sebagai parameter kedua ke fungsi exec (). 3 , Lebih menakjubkan lagi, pernyataan exec di Python 2 juga dapat menentukan ruang nama lokal (seperti variabel yang dinyatakan dalam fungsi). Di Python 3, fungsi exec () juga memiliki fungsi seperti itu.
Seperti pernyataan exec sebelumnya, pernyataan execfile di Python 2 juga dapat menggunakan string seperti mengeksekusi kode Python. Perbedaannya adalah bahwa exec menggunakan string, sedangkan execfile menggunakan file. Di Python 3, pernyataan execfile telah dihapus. Jika Anda benar-benar ingin mengeksekusi kode Python dalam sebuah file (tapi Anda tidak ingin mengimpornya), Anda dapat melakukannya dengan membuka file tersebut, membaca isinya, dan kemudian memanggil fungsi compile () global untuk memaksa Python interpreter mengkompilasi kode, dan kemudian memanggil fungsi exec () baru.
Notes | Python 2 | Python 3 |
---|---|---|
① | execfile(‘a_filename’) | exec(compile(open(‘a_filename’).read(),‘a_filename’,‘exec’)) |
Dalam Python 2, untuk mendapatkan representasi string dari objek arbitrer, ada cara untuk membungkus objek dalam tanda kurung ((sepertix
Dalam Python 3, kemampuan ini masih ada, tetapi Anda tidak bisa lagi menggunakan tanda kutip untuk mendapatkan string seperti itu. Anda perlu menggunakan fungsi global repr ().
Notes | Python 2 | Python 3 |
---|---|---|
① | `x` | repr(x) |
② | `‘PapayaWhip’ + `2`` | repr(‘PapayaWhip’+ repr(2)) |
Dari Python 2 ke Python 3, ada beberapa perubahan dalam tata bahasa untuk menangkap keanehan.
Notes | Python 2 | Python 3 |
---|---|---|
① | try: import mymodule except ImportError, e pass |
try: import mymodule except ImportError as e: pass |
② | try: import mymodule except (RuntimeError, ImportError), e pass |
try: import mymodule except (RuntimeError, ImportError) as e: pass |
③ | try: import mymodule except ImportError: pass |
no change |
④ | try: import mymodule except: pass |
no change |
1 , Python 3 menggunakan kata kunci baru, as。, dibandingkan dengan Python 2 yang menambahkan koma setelah jenis pengecualian. 2. Kata kunci as juga dapat digunakan untuk menangkap beberapa jenis kelainan sekaligus. 3. Jika Anda menangkap sebuah pengecualian, tetapi tidak peduli untuk mengakses objek pengecualian itu sendiri, maka Python 2 dan Python 3 memiliki sintaks yang sama. 4 , Demikian pula, jika Anda menggunakan metode fallback untuk menangkap semua pengecualian, maka sintaks Python 2 dan Python 3 sama. 5. Anda tidak boleh menggunakan metode ini ketika mengimpor modul (atau dalam kebanyakan kasus lain). Jika tidak, program mungkin akan menangkap keanehan seperti KeyboardInterrupt (jika pengguna menekan Ctrl-C untuk menghentikan program), yang membuat debug menjadi lebih sulit.
Di Python 3, ada sedikit perubahan dalam tata bahasa untuk mengeluarkan pengecualian khusus.
Notes | Python 2 | Python 3 |
---|---|---|
① | raise MyException | unchanged |
② | raise MyException,‘error message’ | raise MyException(‘error message’) |
③ | raise MyException,‘error message’, a_traceback | raise MyException(‘errormessage’).with_traceback(a_traceback) |
④ | raise ‘error message’ | unsupported |
1 , Buang keanehan tanpa pesan kesalahan yang disesuaikan oleh pengguna, dalam bentuk paling sederhana ini, tata bahasa tidak berubah. 2 , perubahan terlihat ketika Anda ingin mengeluarkan sebuah pengecualian dengan pesan kesalahan yang disesuaikan oleh pengguna. Python 2 menggunakan koma untuk memisahkan kelas pengecualian dan pesan kesalahan; Python 3 menyampaikan pesan kesalahan sebagai parameter ke kelas pengecualian. Python 2 mendukung sintaks yang lebih rumit untuk mengeluarkan sebuah pengecualian dengan pengulangan yang dapat disesuaikan pengguna. Anda juga dapat melakukan hal yang sama di Python 3, tetapi dengan sintaks yang sama sekali berbeda. 4. Di Python 2, Anda dapat membuang sebuah pengecualian tanpa kelas pengecualian, hanya satu pesan pengecualian. Di Python 3, bentuk ini tidak lagi didukung. 2to3 akan memperingatkan Anda bahwa ia tidak dapat memperbaiki sintaks ini secara otomatis.
Di Python 2, generator memiliki metode “throw” (). Panggilan “a_generator.throw” (,) akan mengeluarkan sebuah pengecualian saat generator dihentikan dan akan mengembalikan nilai berikutnya yang diambil oleh fungsi generator. Di Python 3, fitur ini masih tersedia, tetapi sedikit berbeda dalam tata bahasa.
Notes | Python 2 | Python 3 |
---|---|---|
① | a_generator.throw(MyException) | no change |
② | a_generator.throw(MyException,‘error message’) | a_generator.throw(MyException(‘error message’)) |
③ | a_generator.throw(‘error message’) | unsupported |
Di Python 2, ada dua cara untuk mendapatkan angka dalam kisaran tertentu: range ((), yang mengembalikan sebuah daftar, dan range ((), yang mengembalikan sebuah iterator. Di Python 3, range (() mengembalikan iterator, dan xrange (() tidak ada lagi.
Notes | Python 2 | Python 3 |
---|---|---|
① | xrange(10) | range(10) |
② | a_list = range(10) | a_list = list(range(10)) |
③ | [i for iin xrange(10)] | [i for iin range(10)] |
④ | for i in range(10): | no change |
⑤ | sum(range(10)) | no change |
Dalam kasus yang paling sederhana, 2 to 3 akan mengubah xrange () menjadi range () [2]. Jika kode Python 2 Anda menggunakan range (), 2to3 tidak tahu apakah Anda membutuhkan daftar atau apakah iterator juga bekerja. Sebagai tindakan pencegahan, 2to3 mungkin akan melakukan kesalahan dan kemudian menggunakan list () untuk memaksa nilai yang dikembalikan dari range () untuk dikonversi ke jenis daftar. 3. Jika ada fungsi xrange (() dalam analisis daftar, maka tidak perlu untuk mengubah nilai yang dikembalikan menjadi sebuah daftar, karena analisis daftar sama efektifnya dengan iterator. 4 , sama halnya, for loop juga bekerja pada iterator, jadi tidak ada yang berubah di sini. 5 , fungsi sum ((() dapat bekerja pada iterator, sehingga 2to3 tidak melakukan modifikasi di sini. Sama seperti metode kelas kamus yang mengembalikan nilai sebagai tampilan ((view) dan bukan lagi daftar, ini juga berlaku untuk min (((), max (((), sum (((), list (((), tuple (((), set (((), sorted (((), any (((), all ((()
Python 2 memiliki dua fungsi global yang digunakan untuk meminta input pengguna di baris perintah. Yang pertama disebut input (), yang menunggu pengguna mengetikkan ekspresi Python (), dan kemudian mengembalikan hasilnya (). Yang kedua disebut raw_input (), dan apa yang dimasukkan pengguna akan dikembalikan (). Hal ini sangat membingungkan bagi pemula, dan ini secara luas dianggap sebagai tongkat kepiting dalam bahasa Python (). Python 3 memotong tongkat kepiting ini dengan mengubah namaraw_input () menjadi input (), sehingga sekarang ().
Notes | Python 2 | Python 3 |
---|---|---|
① | raw_input() | input() |
② | raw_input(‘prompt’) | input(‘prompt’) |
③ | input() | eval(input()) |
Pada Python 2, kode dalam fungsi dapat mengakses sifat-sifat khusus dari fungsi itu sendiri. Pada Python 3, sifat-sifat khusus ini diberi nama baru untuk konsistensi.
Notes | Python 2 | Python 3 |
---|---|---|
① | a_function.func_name | a_function._name_ |
② | a_function.func_doc | a_function._doc_ |
③ | a_function.func_defaults | a_function._defaults_ |
④ | a_function.func_dict | a_function._dict_ |
⑤ | a_function.func_closure | a_function._closure_ |
⑥ | a_function.func_globals | a_function._globals_ |
⑦ | a_function.func_code | a_function._code_ |
1、name atribut ((aslifunc_name) berisi nama fungsi。 2、docattribute ((originalfuncdoc) berisi string dokumen yang Anda definisikan dalam kode sumber fungsi ((docstring) 3、defaultsattribute ((originalfunc_defaults) adalah sebuah subset yang menyimpan parameter default. 4、dictattribute (http://www.func_dict.org/) adalah sebuah namespace yang mendukung atribut fungsi arbitrer. 5、closureattribute (http://www.func_closure.org/) adalah sebuah subset dari objek cell yang berisi fungsi yang terikat pada variabel bebas (http://www.freevariable.org/) 6、globalsattribute ((asl func_globals) adalah sebuah referensi ke nama-nama global modul, fungsi itu sendiri didefinisikan di dalam nama-nama tersebut. 7、codeattribute ((originalfunc_code) adalah sebuah objek kode yang mewakili sebuah fungsi yang telah dikompilasi.
Dalam Python 2, file object memiliki metode xreadlines () yang mengembalikan sebuah iterator yang membaca satu baris file pada satu kali. Ini sangat berguna dalam loop for. Bahkan, versi Python 2 yang lebih baru menambahkan fitur ini ke file object itu sendiri.
Dalam Python 3, metode xreadlines () tidak lagi tersedia. 2to3 dapat menyelesaikan situasi sederhana, tetapi beberapa kasus tepi memerlukan intervensi manual.
Notes | Python 2 | Python 3 |
---|---|---|
① | for line in a_file.xreadlines(): | for line in a_file: |
② | for line in a_file.xreadlines(5): | no change (broken) |
Di Python 2, Anda dapat mendefinisikan fungsi lambda anonim, yang memungkinkan fungsi ini untuk menerima beberapa argumen dengan menentukan jumlah elemen dari sebuah subset sebagai argumen. Sebenarnya, interpreter Python 2 menguraikan subset ini menjadi argumen bernama, dan Anda dapat merujuknya di dalam fungsi lambda. Di Python 3, Anda masih dapat mengirimkan sebuah subset sebagai argumen untuk fungsi lambda, tetapi interpreter Python tidak membalasnya menjadi argumen bernama.
Notes | Python 2 | Python 3 |
---|---|---|
① | lambda (x,): x+ f(x) | lambda x1: x1[0]+f(x1[0]) |
② | lambda (x, y): x+f(y) | lambda x_y: x_y[0]+f(x_y[1]) |
③ | lambda (x,(y,z)): x+ y+ z | lambda x_y_z: x_y_z[0]+x_y_z[1][0]+ x_y_z[1][1] |
④ | lambda x, y, z: x+y + z | unchanged |
Jika Anda telah mendefinisikan fungsi lambda yang menggunakan satu elemen yang berisi satu subset sebagai argumen, di Python 3, itu akan dikonversi menjadi satu yang berisi x1.[Fungsi lambda yang dikutip dari 0]。x1 adalah skrip 2to3 yang dibuat secara otomatis berdasarkan parameter penamaan dalam subset aslinya。 2. Fungsi lambda yang menggunakan dua elemen dalam satu subset (x, y) sebagai argumen diubah menjadi x_y, yang memiliki dua argumen posisi, yaitu x_y[0] dan x_y[1]。 Skrip 2 to 3 bahkan dapat menangani fungsi lambda yang menggunakan argumen nama array sebagai argumen. Kode yang dihasilkan agak sulit untuk dibaca, tetapi bekerja sama di Python 3 dengan kode asli di Python 2. 4. Anda dapat mendefinisikan fungsi lambda yang menggunakan beberapa argumen. Jika tidak ada tanda kurung di sekitar argumen, Python 2 akan menganggapnya sebagai fungsi lambda yang berisi beberapa argumen; di dalam fungsi lambda ini, Anda merujuk parameter ini dengan nama, seperti yang Anda lakukan dalam jenis fungsi lainnya.
Di Python 2, metode kelas dapat mengakses objek kelas yang mendefinisikan mereka (class object), dan juga objek metode (method object) itu sendiri. Im_self adalah instance objek kelas; im_func adalah objek fungsi, dan im_class adalah kelas itu sendiri. Di Python 3, atribut-atribut ini diberi nama baru untuk mengikuti konvensi penamaan atribut lainnya.
Notes | Python 2 | Python 3 |
---|---|---|
① | aClassInstance.aClassMethod.im_func | aClassInstance.aClassMethod._func_ |
② | aClassInstance.aClassMethod.im_self | aClassInstance.aClassMethod._self_ |
③ | aClassInstance.aClassMethod.im_class | aClassInstance.aClassMethod._self_._class_ |
Di Python 2, Anda dapat membuat kelas Anda sendiri dan membuat mereka dapat digunakan dalam konteks boolean. Sebagai contoh, Anda dapat menginstansikan kelas dan menggunakan objek contoh ini dalam sebuah pernyataan if. Untuk tujuan ini, Anda mendefinisikan sebuahnonzero() metode, yang mengembalikan 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 menjadibool()。
Notes | Python 2 | Python 3 |
---|
|①|class A:
def nonzero(self):
pass|class A:
def bool(self):
pass
|②|class A:
def nonzero(self, x, y):
pass|no change|
1. Python 3 akan memanggil sebuah obyek kelas ketika digunakan dalam konteks BULLbool(), bukannonzero()。
Namun, jika Anda memiliki definisi yang menggunakan dua parameter__nonzero_Metode 2 to 3 skrip akan mengasumsikan bahwa metode yang Anda definisikan memiliki kegunaan lain, sehingga tidak akan melakukan modifikasi pada kode tersebut.
Di antara Python 2 dan Python 3, ada sedikit perubahan dalam tata bahasa untuk mendefinisikan bilangan oktal.
Notes | Python 2 | Python 3 |
---|---|---|
① | x = 0755 | x = 0o755 |
Karena integer panjang dan integer telah diintegrasikan, konstanta sys.maxint tidak lagi akurat. Tetapi karena nilai ini masih berguna untuk mendeteksi kemampuan platform tertentu, ia dipertahankan oleh Python 3 dan diberi nama sys.maxsize.
Notes | Python 2 | Python 3 |
---|---|---|
① | from sys importmaxint | from sys importmaxsize |
② | a_function(sys.maxint) | a_function(sys.maxsize) |
1 , maxint menjadi maxsize . 2. Semua sys.maxint berubah menjadi sys.maxsize。
Di Python 2, Anda dapat menggunakan fungsi global callable (() untuk memeriksa apakah suatu objek dapat dipanggil ((callable, misalnya fungsi) ➜ Di Python 3, fungsi global ini dihapus ➜ Untuk memeriksa apakah suatu objek dapat dipanggil, Anda dapat memeriksa metode khusus__call_Keberadaan
Notes | Python 2 | Python 3 |
---|---|---|
① | callable(anything) | hasattr(anything,’_call_’) |
Dalam Python 2, fungsi global zip() dapat menggunakan beberapa urutan arbitrer sebagai argumen, dan mengembalikan sebuah daftar yang terdiri dari subgrup. Subgrup pertama berisi elemen pertama dari setiap urutan; subgrup kedua berisi elemen kedua dari setiap urutan; dan kemudian diturunkan. Dalam Python 3, zip() mengembalikan sebuah iterator, bukan daftar.
Notes | Python 2 | Python 3 |
---|---|---|
① | zip(a, b, c) | list(zip(a, b, c)) |
② | d.join(zip(a, b, c)) | no change |
Dalam bentuk yang paling sederhana, Anda dapat mengembalikan fungsi sebelum fungsi zip dengan memanggil fungsi return of the zip () function, yang akan berjalan melalui iterator yang dikembalikan oleh fungsi zip () ini, dan kemudian mengembalikan hasil list tersebut. Dalam konteks di mana semua elemen dari sebuah urutan telah dilalui (seperti di sini dengan menggunakan metode join), iterator yang dikembalikan oleh zip () dapat bekerja dengan baik. Skrip 2 to 3 akan mendeteksi hal-hal ini dan tidak akan mengubah kode Anda.
Di Python 2, StandardError adalah subkelas dari semua keanehan bawaan selain StopIteration, GeneratorExit, KeyboardInterrupt, dan SystemExit. Di Python 3, StandardError telah dihapus dan digantikan dengan Exception.
Notes | Python 2 | Python 3 |
---|---|---|
① | x =StandardError() | x =Exception() |
② | x =StandardError(a, b, c) | x =Exception(a, b, c) |
Berbagai konstanta dalam modul types dapat membantu Anda menentukan jenis objek. Di Python 2, ini berisi konstanta yang mewakili semua jenis data dasar, seperti dict dan int. Di Python 3, konstanta ini telah dihapus. Hanya perlu menggunakan nama tipe dasar untuk menggantikannya.
Notes | Python 2 | Python 3 |
---|---|---|
types.UnicodeType | str | |
types.StringType | bytes | |
types.DictType | dict | |
types.IntType | int | |
types.LongType | int | |
types.ListType | list | |
types.NoneType | type(None) | |
types.BooleanType | bool | |
types.BufferType | memoryview | |
types.ClassType | type | |
types.ComplexType | complex | |
types.EllipsisType | type(Ellipsis) | |
types.FloatType | float | |
types.ObjectType | object | |
types.NotImplementedType | type(NotImplemented) | |
types.SliceType | slice | |
types.TupleType | tuple | |
types.TypeType | type | |
types.XRangeType | range |
types.StringType dipetakan ke dalam byte, bukan str, karena Python 2’s string (string yang tidak dikodekan Unicode, yaitu string biasa) sebenarnya hanya beberapa urutan byte yang dikodekan dengan beberapa jenis karakter (a sequence of bytes).
isinstance() berfungsi untuk memeriksa apakah suatu objek adalah contoh dari suatu kelas atau tipe tertentu. Di Python 2, Anda dapat mengirim sebuah subset dari tipe ke instance (), dan jika objek tersebut adalah tipe dari subset tersebut, fungsi tersebut akan mengembalikan True. Di Python 3, Anda masih dapat melakukan ini, tetapi tidak disarankan untuk menggunakan tipe sebagai argumen yang dikirimkan dua kali.
Notes | Python 2 | Python 3 |
---|---|---|
isinstance(x,(int,float,int)) | isinstance(x,(int,float)) |
Python 2 memiliki dua jenis string: string yang di-encode oleh Unicode dan string yang tidak di-encode oleh Unicode. Tetapi sebenarnya ada jenis lain, yaitu basestring. Ini adalah tipe data abstrak, yang merupakan superclass dari str dan unicode.
Notes | Python 2 | Python 3 |
---|---|---|
isinstance(x, basestring) | isinstance(x, str) |
Python 2.3 memperkenalkan modul itertools, yang mendefinisikan varian dari fungsi global zip (), map (), dan filter (), yang dikembalikan sebagai iterator, bukan daftar. Di Python 3, karena fungsi global ini dikembalikan sebagai iterator, fungsi-fungsi varian di itertools ini dibatalkan.
Notes | Python 2 | Python 3 |
---|---|---|
① | itertools.izip(a, b) | zip(a, b) |
② | itertools.imap(a, b) | map(a, b) |
③ | itertools.ifilter(a, b) | filter(a, b) |
④ | from itertools import imap, izip, foo | from itertools import foo |
Pada saat melakukan pengecualian, ada tiga variabel yang dapat Anda akses di dalam modul sys: sys.exc_type, sys.exc_value, sys.exc_traceback. (Sebenarnya, ini sudah ada pada zaman Python 1.)
Notes | Python 2 | Python 3 |
---|---|---|
sys.exc_type | sys.exc_info()[0] | |
sys.exc_value | sys.exc_info()[1] | |
sys.exc_traceback | sys.exc_info()[2] |
Di Python 2, jika Anda perlu menulis perhitungan daftar yang melintasi unsur, Anda tidak perlu menambahkan tanda kurung di sekitar nilai unsur. Di Python 3, tanda kurung ini diperlukan.
Notes | Python 2 | Python 3 |
---|---|---|
[i for iin 1,2] | [i for iin(1,2)] |
Python 2 memiliki sebuah fungsi yang disebut os.getcwd() yang mengembalikan direktori kerja saat ini sebagai sebuah string (((yang tidak dienkode dalam Unicode). Karena sistem file modern mampu menangani nama direktori yang dienkode dalam Unicode, Python 2.3 memperkenalkan fungsi os.getcwdu (((). fungsi tersebut mengembalikan string yang dienkode dalam direktori kerja saat ini dalam Unicode. Di Python 3, karena hanya ada satu jenis string (tipe Unicode), Anda hanya perlu os.getcwd (().
Notes | Python 2 | Python 3 |
---|---|---|
os.getcwdu() | os.getcwd() |
Di Python 2, Anda dapat mendefinisikan parameter metaclass dalam deklarasi kelas, atau mendefinisikan tingkat kelas khusus (class-level)metaclassattribute, untuk membuat subkelas.__metaclass_Atribut _ telah dihapus.
Notes | Python 2 | Python 3 |
---|---|---|
① | class C(metaclass=PapayaMeta): pass |
unchanged |
② | class Whip: _metaclass_ = PapayaMeta |
class Whip(metaclass=PapayaMeta): pass |
③ | class C(Whipper, Beater): _metaclass_ = PapayaMeta |
class C(Whipper,Beater,metaclass=PapayaMeta): pass |
Perbaikan-perbaikan yang tercantum di bawah ini pada dasarnya bukan merupakan perbaikan yang sebenarnya. Maksudnya, mereka hanya masalah gaya kode, dan tidak menyangkut sifat kode. Namun, pengembang Python sangat tertarik untuk membuat gaya kode sesuaikan mungkin. Untuk itu, ada panduan resmi khusus yang menggambarkan gaya kode Python.
Di Python 2, satu-satunya cara untuk mendefinisikan sebuah himpunan nilai literal adalah dengan memanggil set (a_sequence). Di Python 3, ini masih berlaku, tetapi menggunakan tanda baca baru: tanda baca literal: tanda kurung besar ({}) adalah cara yang lebih jelas. Metode ini bekerja di luar himpunan kosong, karena kamus juga menggunakan tanda kurung besar, sehingga {} menunjukkan sebuah kamus kosong, bukan himpunan kosong.
Skrip 2to3 secara default tidak memperbaiki set ((() nilai literal. Untuk mengaktifkan fitur ini, tentukan -f set_literal parameter pada saat panggilan baris perintah 2to3.
Notes | Before | After |
---|---|---|
set([1,2,3]) | {1,2,3} | |
set((1,2,3)) | {1,2,3} | |
set([i for iin a_sequence]) | {i for iin a_sequence} |
Objek Python yang diimplementasikan dengan C dapat mengekspor sebuah buffer interface yang memungkinkan kode Python lainnya untuk langsung membaca dan menulis ke dalam sebuah bagian memori. Kedengarannya sangat kuat, tetapi juga menakutkan. Dalam Python 3, buffer dirubah menjadi memoryview. Modifikasi sebenarnya lebih rumit, tetapi Anda hampir dapat mengabaikan perbedaan ini.
Skrip 2to3 secara default tidak memperbaiki fungsi buffer (). Untuk mengaktifkan fitur ini, tentukan parameter -f buffer pada saat panggilan baris perintah 2to3.
Notes | Before | After |
---|---|---|
x =buffer(y) | x =memoryview(y) |
Meskipun Python sangat ketat tentang spasi yang digunakan untuk mengindentifikasi dan memunculkan (indenting and outdenting), Python sangat bebas untuk menggunakan spasi dalam hal-hal lain. Dalam daftar, subgrup, kumpulan, dan kamus, spasi dapat muncul di depan atau di belakang koma, yang tidak akan berdampak buruk. Namun, panduan gaya kode Python menyatakan bahwa koma tidak dapat memiliki spasi, dan koma harus berisi spasi. Meskipun ini hanya pertimbangan estetika, kode masih dapat bekerja dengan baik, baik di Python 2 dan Python 3, tetapi skrip 2to3 dapat melakukan perbaikan ini untuk Anda berdasarkan standar di buku panduan.
Skrip 2to3 secara default tidak memperbaiki spasi di sekitar tanda koma. Untuk mengaktifkan fitur ini, tentukan parameter -f wscomma saat memanggil 2to3 di baris perintah.
Notes | Before | After |
---|---|---|
a ,b | a, b | |
{a :b} | {a: b} |
Banyak kebiasaan yang dibangun dalam komunitas Python. Ada beberapa seperti while 1: loop, yang berasal dari Python 1. Python tidak memiliki