Perubahan antara Python 2.x.x dan Python 3.x.x & Cara mengonversi Python 2.x.x ke Python 3.x.x

Dibuat di: 2016-10-09 12:36:49, diperbarui pada: 2017-10-11 10:18:05
comments   2
hits   4926

Perbedaan dan perubahan bahasa antara python2 dan python3

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.

  • #### kalimat print

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()
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)
  1. Untuk menghasilkan baris kosong, kita harus memanggil print tanpa parameter.
  2. Untuk menghasilkan nilai yang terpisah, kita perlu memasukkan nilai tersebut sebagai sebuah argumen print ().
  3. Untuk output, gunakan dua nilai yang dipisahkan dengan spasi, dengan dua argumen yang disebut print (((). Dalam Python 2, jika Anda menggunakan tanda koma ((,) sebagai akhir dari kalimat print, itu akan memisahkan hasil output dengan spasi, dan kemudian mengekspor spasi yang diikuti ((trailing space), tanpa mengekspor carriage return). Dalam Python 3, efek yang sama dapat dicapai dengan memberikan end=’ ‘ sebagai argumen kata kunci ke print. Parameter end default adalah ‘\n’, jadi dengan menetapkan kembali nilai parameter end, Anda dapat membatalkan tanda carriage return di akhir output.
  4. Di Python 2, Anda dapat melakukan fungsi yang sama dengan menggunakan sintaks >>pipe_name untuk mengalihkan output ke pipa, seperti sys.stderr. Di Python 3, Anda dapat melakukan fungsi yang sama dengan memberikan nilai pipa sebagai parameter file kata kunci ke print. Parameter file default adalah std.stdout, sehingga menetapkan kembali nilainya akan membuat output print ke pipa lain.
  • #### Senar Unicode

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。

  • #### Fungsi global (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)
  • #### long bentuk bulat

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 ▽.

  • #### <> Bandingkan operator

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.

  • #### Metode has_key()

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)
  1. Bentuk paling sederhana.
  2. Operator or memiliki prioritas lebih rendah dari operator in, jadi tidak perlu menambahkan tanda kurung disini.
  3. Di sisi lain, untuk alasan yang sama, or memiliki prioritas lebih rendah dari in, di mana tanda kurung harus ditambahkan. Perhatikan bahwa kode di sini sama sekali berbeda dengan kode di baris sebelumnya. Python akan menginterpretasikan x atau y terlebih dahulu, mendapatkan hasil x (jika x adalah nilai yang benar dalam konteks Boolean) atau y. Kemudian Python memeriksa apakah hasil ini adalah a._sebuah kunci dictionary。)
  4. Operator in memiliki prioritas lebih rendah dari operator +, sehingga bentuk kode ini secara teknis tidak memerlukan tanda kurung, tetapi 2to3 ditambahkan.
  5. Formulir ini tentu membutuhkan tanda kurung, karena in memiliki prioritas lebih rendah dari +。
  • #### Metode kelas kamus yang mengembalikan daftar

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
  1. Menggunakan fungsi list () untuk mengubah keys () ke dalam sebuah daftar statis, untuk alasan keamanan, 2 to 3 mungkin akan melakukan kesalahan. Kode seperti ini bekerja, tetapi untuk menggunakan tampilan, itu tidak efisien. Anda harus memeriksa kode setelah konversi untuk melihat apakah Anda membutuhkan daftar, mungkin tampilan juga dapat melakukan pekerjaan yang sama. 2 , ini adalah tampilan lain tentang () untuk metode item () ke daftar. 2to3 untuk metode nilai () untuk mengembalikan nilai adalah sama. 3 , Python 3 tidak lagi mendukung iterkeys (((). Jika perlu, gunakan iter ((() untuk mengubah nilai kembali keys ((() menjadi iterator. 4, 2to3 dapat mengidentifikasi metode iterkeys () yang digunakan dalam analisis daftar, dan kemudian mengubahnya menjadi metode keys () di Python 3 tanpa perlu menggunakan iter tambahan () untuk membungkus nilai yang dikembalikan. 5 2to3 juga dapat mengidentifikasi bahwa keys ((() metode yang dikembalikan langsung ke fungsi lain yang akan menjelajahi seluruh urutan, sehingga tidak perlu untuk mengubah keys ((() kembali ke daftar. Sebaliknya, min ((() fungsi akan dengan senang hati menjelajahi tampilan. Proses ini sama efektifnya untuk min (((), max (((), sum (((), list (((), tuple (((), set (((), sorted (((), any ((() dan all (()).
  • #### Modul yang diberi nama atau disusun ulang

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.

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

  • urllib Python 2 memiliki beberapa modul untuk menganalisis, mengkode, dan mengambil URL, tetapi modul-modul ini saling tumpang tindih seperti sarang tikus. Di Python 3, modul-modul ini direkonstruksi dan dikombinasikan menjadi paket terpisah, urllib.
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())
  • dbm Semua DBM clone sekarang ada dalam paket terpisah, dbm. Jika Anda membutuhkan varian tertentu dari DBM, seperti GNUDBM, Anda dapat mengimpor modul yang sesuai dari paket dbm.
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
  • xmlrpc XML-RPC adalah metode kelas ringan untuk melakukan panggilan RPC jarak jauh melalui protokol HTTP. Beberapa perpustakaan implementasi dari klien XML-RPC dan server XML-RPC sekarang dikombinasikan ke dalam paket terpisah, xmlrpc.
Notes Python 2 Python 3
import xmlrpclib import xmlrpc.client
import DocXMLRPCServer
import SimpleXMLRPCServer
import xmlrpc.server
  • #### Modul lainnya
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
  1. Di Python 2, Anda biasanya melakukan ini, pertama-tama mencoba mengimpor cStringIO sebagai pengganti StringIO, dan jika gagal, mengimpor StringIO. Jangan lakukan ini di Python 3; modul io akan membantu Anda dalam hal ini.
  2. Di Python 2, mengimpor implementasi pickle tercepat adalah cara yang sama seperti di atas. Di Python 3, modul pickle akan mengolahnya secara otomatis, jadi jangan lakukan lagi. Modul builtins berisi fungsi global, kelas, dan konstanta yang digunakan di seluruh bahasa Python. Mendefinisikan fungsi tertentu di dalam modul builtins berarti mendefinisikan fungsi global ini di mana-mana. Ini terdengar kuat, tetapi juga menakutkan.
  3. Copyreg menambahkan dukungan untuk modul pickle untuk tipe kustomisasi pengguna yang didefinisikan dalam bahasa C.
  4. Modul queue mengimplementasikan antrean multi-produsen, multi-konsumen.
  5. Modul socketserver menyediakan kelas dasar umum untuk mengimplementasikan berbagai jenis socket server. 7 . Modul configparser digunakan untuk menganalisis file konfigurasi INI-style .
  6. Modul reprlib merealisasikan fungsi repr () yang sudah ada dan menambahkan kontrol terhadap panjang string yang diekspresikan sebelum dipotong. Modul subprocess memungkinkan Anda untuk membuat subproses, terhubung ke pipeline mereka, dan mendapatkan nilai yang dikembalikan dari mereka.
  • Impor relatif dalam paket

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
  1. Ketika Anda perlu mengimpor seluruh modul dari bagian lain dari paket, gunakan sintaks baru dari .import. Di sini tanda baris (((.) menunjukkan jalur relatif antara file saat ini (universaldetector.py) dan file yang ingin Anda impor (constants.py). Dalam contoh ini, kedua file tersebut berada dalam direktori yang sama, jadi tanda baris tunggal digunakan. Anda juga dapat mengimpor dari direktori induk (from .. import anothermodule) atau subdirektori.
  2. Untuk mengimpor kelas atau fungsi tertentu dari modul lain ke ruang nama modul Anda, tambahkan path relatif di nama modul yang ingin diimpor, dan hapus garis miring terakhir (slash). Dalam contoh ini, mbcharsetprober.py dan universaldetector.py berada di dalam direktori yang sama, jadi nama path relatif adalah sebuah tanda baca. Anda juga dapat mengimpor dari direktori induk (from .. import anothermodule) atau dari subdirektori.
  • #### Metode iterator (next)

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。)

  • #### Filter fungsi global

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.

  • #### Global Function Map (dalam bahasa Inggris)

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.

  • #### Fungsi global reduksi

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

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.

  • #### Fungsi global intern

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)
  • #### Pernyataan exec

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.

  • #### pernyataan execfile

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’))
  • #### repr (dengan tanda kutip)

Dalam Python 2, untuk mendapatkan representasi string dari objek arbitrer, ada cara untuk membungkus objek dalam tanda kurung ((sepertixDalam 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))
  1. Ingat, x bisa menjadi apa saja, seperti kelas, fungsi, modul, tipe data dasar, dan lain sebagainya.
  2. Dalam Python 2, tanda kurung bisa disematkan, yang menghasilkan ekspresi yang membingungkan (tapi efektif). 2to3 cukup cerdas untuk mengubah panggilan yang disematkan ke fungsi repr ().
  • #### Cobalah… kecuali kalimat

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.

  • #### kalimat raise

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.

  • #### Metode Throw dari Generator

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
  1. Dalam bentuk paling sederhana, generator akan menghasilkan sebuah exception yang tidak memiliki pesan kesalahan yang dapat disesuaikan oleh pengguna. Dalam hal ini, tidak ada perubahan pada sintaksis dari Python 2 ke Python 3.
  2. Jika generator memunculkan sebuah pengecualian dengan pesan kesalahan yang disesuaikan pengguna, Anda perlu menyampaikan string pesan kesalahan ini ke kelas pengecualian untuk menginstansikannya. 3 , Python 2 juga mendukung pengecualian yang hanya menampilkan informasi yang luar biasa. Python 3 tidak mendukung sintaks ini, dan 2to3 akan menampilkan pesan peringatan yang memberi tahu Anda bahwa Anda perlu memperbaiki kode ini secara manual.
  • #### Fungsi global xrange

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

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

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())
  1. Dalam bentuk yang paling sederhana, raw_input (() diganti dengan input (() }}.
  2. Di Python 2, fungsi raw_input ((() dapat menetapkan sebuah tanda petik sebagai argumen. Di Python 3, fungsi ini dipertahankan.
  3. Jika Anda benar-benar ingin meminta pengguna untuk mengetikkan ekspresi Python dan menghitung hasilnya, Anda dapat memanggil fungsi input () dan mengirimkan nilai yang dikembalikan ke eval () [2].
  • #### Properti fungsi

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.

  • #### Metode I/O xreadlines

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)
  1. Jika Anda sebelumnya memanggil xreadlines tanpa argumen ((), 2to3 akan mengubahnya menjadi objek file itu sendiri. Dalam Python 3, kode setelah konversi ini dapat melakukan pekerjaan yang sama seperti sebelumnya: membaca satu baris file sekali, dan kemudian melakukan lingkaran lingkaran for. Jika Anda sebelumnya menggunakan argumen ((jumlah baris yang dibaca per kali) untuk memanggil xreadlines ((), 2to3 tidak dapat melakukan konversi dari Python 2 ke Python 3 untuk Anda, kode Anda akan gagal dengan cara ini: AttributeError: ‘_io.TextIOWrapper’ object has no attribute ‘xreadlines’. Anda dapat mengubah xreadlines menjadi readlines secara manual agar kode dapat bekerja di Python 3.
  • #### Fungsi lambda yang menggunakan unsur dan bukan beberapa argumen

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.

  • #### Sifat-sifat metode khusus

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_
  • #### nonzero Metode Khusus

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.

  • #### Tipe Octahedral

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

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。

  • #### Fungsi global yang dapat di-callable

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_’)
  • #### Fungsi global (zip)

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.

  • #### StandarError yang tidak normal

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

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

  • #### Instansi fungsi global

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

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)
  • #### Modul itertools

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
  1. Menggunakan fungsi global zip (), bukan itertools.izip ().
  2. Menggunakan map.imap (bukan itertools.imap) 3 ,itertools.ifilter() menjadi filter() 。
  3. Modul itertools tetap ada di Python 3, hanya saja tidak lagi berisi fungsi yang telah dipindahkan ke namespace global. Skrip 2to3 cukup cerdas untuk menghapus importasi yang tidak lagi berguna, sambil menjaga integritas importasi lainnya.
  • #### sys.exc_type, sys.exc_value, sys.exc_traceback

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]
  • #### Daftar parsing untuk subgrup

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)]
  • #### fungsi os.getcwdu

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()
  • #### Kelas dasar (metaclass)

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
  1. Mengumumkan parameter metaclass pada saat deklarasi kelas, ini berlaku di Python 2 dan Python 3, keduanya sama.
  2. Mengatakan dalam definisi kelas bahwa atribut metaclass berlaku di Python 2, tetapi tidak lagi berlaku di Python 3. 3, 2to3 dapat membangun sebuah deklarasi kelas yang valid, bahkan jika kelas tersebut mewarisi dari beberapa kelas induk.
  • #### Tentang gaya kode

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.

  • #### set (nilai literal)

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}
  • #### Buffer fungsi global (expressive)

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)
  • #### Ruang kosong di sekitar tanda koma

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}
  • #### Istilah umum (common idioms)

Banyak kebiasaan yang dibangun dalam komunitas Python. Ada beberapa seperti while 1: loop, yang berasal dari Python 1. Python tidak memiliki