Type/to search
8
Follow
1370
Followers
Perubahan antara Python 2.x.x dan Python 3.x.x & Cara mengonversi Python 2.x.x ke Python 3.x.x
Tutorials
Created 2016-10-09 12:36:49  Updated 2017-10-11 10:18:05
 2
 5674

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.

NotesPython 2Python 3
printprint()
print 1print(1)
print 1,2print(1,2)
print 1,2,print(1,2,end=' ')
print >>sys.stderr,1,2,3print(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

NotesPython 2Python 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.)

NotesPython 2Python 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.

NotesPython 2Python 3
x = 1000000000000Lx = 1000000000000
x = 0xFFFFFFFFFFFFLx = 0xFFFFFFFFFFFF
long(x)int(x)
type(x) is longtype(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 <>.

NotesPython 2Python 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

NotesPython 2Python 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.

NotesPython 2Python 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.
NotesPython 2Python 3
import httplibimport http.client
import Cookieimport http.cookies
import cookielibimport http.cookiejar
import BaseHTTPServer <br> import SimpleHTTPServer <br> import CGIHttpServerimport 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.
NotesPython 2Python 3
import urllibimport urllib.request <br> urllib.parse,urllib.error
import urllib2import urllib.request <br> urllib.error
import urlparseimport urllib.parse
import robotparserimport urllib.robotparser
from urllib import FancyURLopener <br> from urllib import urlencodefrom urllib.request import FancyURLopener <br> from urllib.parse import urlencode
from urllib2 import Request <br> from urllib2 import HTTPErrorfrom urllib.request import Request <br> 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.

NotesPython 2Python 3
import urllib print urllib.urlopen('http://diveintopython3.org/').read()import urllib.request, urllib.parse, urllib.error <br> 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.
NotesPython 2Python 3
import dbmimport dbm.ndbm
import gdbmimport dbm.gnu
import dbhashimport dbm.bsd
import dumbdbmimport dbm.dumb
import anydbm <br> import whichdbimport 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.
NotesPython 2Python 3
import xmlrpclibimport xmlrpc.client
import DocXMLRPCServer <br> import SimpleXMLRPCServerimport xmlrpc.server
  • Modul lainnya

NotesPython 2Python 3
try:<br>  import cStringIO as StringIO <br>except ImportError: <br>  import StringIOimport io
try:<br>  import cPickle as pickle <br>except ImportError: <br>  import pickleimport pickle
import _builtin_import builtins
import copy_regimport copyreg
import Queueimport queue
import SocketServerimport socketserver
import ConfigParserimport configparser
import reprimport reprlib
import commandsimport 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?

NotesPython 2Python 3
import constantsfrom .import constants
from mbcharsetprober import MultiByteCharSetProberfrom .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.

NotesPython 2Python 3
anIterator.next()next(anIterator)
a_function_that_returns_an_iterator().next()next(a_function_that_returns_an_iterator())
class A:<br>  def next(self):<br>  passclass A:<br>  def next(self):<br>  pass|
class A:<br>  def next(self, x, y):<br>  passno change
next = 42<br>for an_iterator in a_sequence_of_iterators:<br>  an_iterator.next()next = 42<br>for an_iterator in a_sequence_of_iterators:<br>  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 mendefinisikan__next__() 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.

NotesPython 2Python 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.

NotesPython 2Python 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。

NotesPython 2Python 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) <unk>. 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.

NotesPython 2Python 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.

NotesPython 2Python 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.

NotesPython 2Python 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.

NotesPython 2Python 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 ().

NotesPython 2Python 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.

NotesPython 2Python 3
try:<br>  import mymodule<br>except ImportError, e<br>  passtry:<br>  import mymodule<br>except ImportError as e:<br>  pass
try:<br>  import mymodule<br>except (RuntimeError, ImportError), e<br>  passtry:<br>  import mymodule<br>except (RuntimeError, ImportError) as e:<br>  pass
try:<br>  import mymodule<br>except ImportError:<br>  passno change
try:<br>  import mymodule<br>except:<br>  passno 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 <i>fallback</i> 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.

NotesPython 2Python 3
raise MyExceptionunchanged
raise MyException,'error message'raise MyException('error message')
raise MyException,'error message', a_tracebackraise 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.

NotesPython 2Python 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.

NotesPython 2Python 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 ().

NotesPython 2Python 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.

NotesPython 2Python 3
a_function.func_namea_function._name_
a_function.func_doca_function._doc_
a_function.func_defaultsa_function._defaults_
a_function.func_dicta_function._dict_
a_function.func_closurea_function._closure_
a_function.func_globalsa_function._globals_
a_function.func_codea_function._code_

1、name atribut ((aslifunc_name) berisi nama fungsi。
2、__doc__attribute ((originalfuncdoc) berisi string dokumen yang Anda definisikan dalam kode sumber fungsi ((docstring)
3、__defaults__attribute ((originalfunc_defaults) adalah sebuah subset yang menyimpan parameter default.
4、__dict__attribute (http://www.func_dict.org/) adalah sebuah namespace yang mendukung atribut fungsi arbitrer.
5、__closure__attribute (http://www.func_closure.org/) adalah sebuah subset dari objek cell yang berisi fungsi yang terikat pada variabel bebas (http://www.freevariable.org/)
6、__globals__attribute ((asl func_globals) adalah sebuah referensi ke nama-nama global modul, fungsi itu sendiri didefinisikan di dalam nama-nama tersebut.
7、__code__attribute ((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.

NotesPython 2Python 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.

NotesPython 2Python 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+ zlambda x_y_z: x_y_z[0]+x_y_z[1][0]+ x_y_z[1][1]
lambda x, y, z: x+y + zunchanged

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.

NotesPython 2Python 3
aClassInstance.aClassMethod.im_funcaClassInstance.aClassMethod._func_
aClassInstance.aClassMethod.im_selfaClassInstance.aClassMethod._self_
aClassInstance.aClassMethod.im_classaClassInstance.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 sebuah__nonzero__() 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 menjadi__bool__()。

NotesPython 2Python 3

|①|class A:<br>  def nonzero(self):<br>  pass|class A:<br>  def bool(self):<br>  pass
|②|class A:<br>  def nonzero(self, x, y):<br>  pass|no change|

  1. Python 3 akan memanggil sebuah obyek kelas ketika digunakan dalam konteks BULL__bool__(), bukan__nonzero__()。
    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.

NotesPython 2Python 3
x = 0755x = 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.

NotesPython 2Python 3
from sys importmaxintfrom 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

NotesPython 2Python 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.

NotesPython 2Python 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.

NotesPython 2Python 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.

NotesPython 2Python 3
types.UnicodeTypestr
types.StringTypebytes
types.DictTypedict
types.IntTypeint
types.LongTypeint
types.ListTypelist
types.NoneTypetype(None)
types.BooleanTypebool
types.BufferTypememoryview
types.ClassTypetype
types.ComplexTypecomplex
types.EllipsisTypetype(Ellipsis)
types.FloatTypefloat
types.ObjectTypeobject
types.NotImplementedTypetype(NotImplemented)
types.SliceTypeslice
types.TupleTypetuple
types.TypeTypetype
types.XRangeTyperange

types.StringType dipetakan ke dalam byte, bukan str, karena Python 2's <unk>string<unk> (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.

NotesPython 2Python 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.

NotesPython 2Python 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.

NotesPython 2Python 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, foofrom 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.)

NotesPython 2Python 3
sys.exc_typesys.exc_info()[0]
sys.exc_valuesys.exc_info()[1]
sys.exc_tracebacksys.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.

NotesPython 2Python 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 (().

NotesPython 2Python 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)__metaclass__attribute, untuk membuat subkelas.__metaclass_Atribut _ telah dihapus.

NotesPython 2Python 3
class C(metaclass=PapayaMeta):<br>  passunchanged
class Whip:<br>  _metaclass_ = PapayaMetaclass Whip(metaclass=PapayaMeta):<br>  pass
class C(Whipper, Beater):<br>  _metaclass_ = PapayaMetaclass C(Whipper,Beater,metaclass=PapayaMeta):<br>  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.

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

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

NotesBeforeAfter
a ,ba, 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 jenis Boolean secara harfiah sampai Python 2.3, sehingga pengembang sebelumnya menggunakan 1 dan 0 sebagai pengganti.

Skrip 2to3 secara default tidak akan melakukan perbaikan untuk kebiasaan ini. Untuk mengaktifkan fitur ini, tentukan parameter -f idioms pada saat panggilan 2to3 di baris perintah.

NotesBeforeAfter
while 1:<br>  do_stuff()while True:<br>  do_stuff()
type(x) == Tisinstance(x, T)
type(x) is Tisinstance(x, T)
a_list = list(a_sequence)a_list = sorted(a_sequence)
a_list.sort()do_stuff(a_list)
do_stuff(a_list)

Diposting olehBlog CSDN

Bagaimana mengubah kode Python 2 ke kode Python 3

Bagaimana mengubah kode Python 2.x menjadi kode Python 3.x.
Cara mengubah kode Python 2.x ke kode Python 3.x

  • 1. Mengubahnya sendiri secara manual

Ini tidak perlu banyak bicara, jika hanya melibatkan beberapa fungsi, seperti print dan lain-lain.

Jadi, jika Anda ingin mengubah kode Anda sendiri, Anda bisa melakukannya.

  • 2. Menggunakan Python built-in (Python script) tool untuk membantu Anda melakukan konversi secara otomatis

Versi Python 2.x, seperti Python 2.7.2 yang saya instal, memiliki beberapa alat yang berguna setelah diunduh dan diinstal di windows.

Salah satunya, yang disebut 2to3.py, adalah untuk membantu Anda mengimplementasikan, mengubah kode Python 2.x menjadi kode Python 3.x.

Situs ini berlokasi di: Python Installation Root Directory

Bagaimana cara menggunakan 2to3.py untuk mengimplementasikan kode Python 2.x, untuk mengubah kode Python 3.x
Misalnya, saya memiliki skrip Python 2.x:

D:\tmp\tmp_dev_root\python\python2_to_python3\34563264_data_from_site.py

Sekarang, kode untuk mengubahnya menjadi Python 3.x.

Anda dapat mencarinya dengan membuka cmd windows, dan mencarinya di bawah skrip yang akan dikonversi, dan kemudian menjalankannya

D:\tmp\WordPress\DevRoot\Python27\Tools\Scripts\2to3.py -w 34563264_data_from_site.py

Hasilnya 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="#">[email protected]</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 34563264_data_from_site.py telah berubah menjadi kode Python 3.x.

Ada juga file bak::34563264_data_from_site.py.bak, bandingkan keduanya, dan Anda akan melihat perbedaan:

img

Saat ini, untuk 2to3.py sendiri, Anda bisa melihat lebih banyak lagi dengan mencari bantuan:

D:\tmp\tmp_dev_root\python\python2_to_python3>D:\tmp\WordPress\DevRoot\Python27\Tools\Scripts\2to3.py -h Usage: 2to3 [options] file|dir ... Options: -h, --help show this help message and exit -d, --doctests_only Fix up doctests only -f FIX, --fix=FIX Each FIX specifies a transformation; default: all -j PROCESSES, --processes=PROCESSES Run 2to3 concurrently -x NOFIX, --nofix=NOFIX Prevent a transformation from being run -l, --list-fixes List available transformations -p, --print-function Modify the grammar so that print() is a function -v, --verbose More verbose logging --no-diffs Don't show diffs of the refactoring -w, --write Write back modified files -n, --nobackups Don't write backups for modified files

Di sini, saya hanya menjelaskan beberapa hal:

(1) Jika tidak ada parameter -w di atas, maka secara default hanya akan mencetak konten diff yang sesuai dengan proses konversi ke jendela saat ini.

(2) Menambahkan -w berarti mengubah isi, menulis kembali ke dokumen asli.

(3) Jika Anda tidak ingin membuat file bak, tambahkan -n.

(4) Jika Anda tidak ingin melihat banyak output, tambahkan no-diffs.

Yang lainnya, tidak banyak diceritakan.

2 to 3 di atas adalah terjemahan dariDalam perjalanan

Jika ada kesalahan, silakan tunjukkan! ^_^

Related Recommendations
Comment
All comments (2)

    botvs用的python2?

    9 years ago

    BotVS 的回测服务器 使用的是Python 2.7版本, 对于BotVS 平台 Python2 ,Python3 都是支持的。

    9 years ago
  • 1
Forums
PINE Language
Get the app
iPhone Download
© 2015 - ∞ INVENTOR PTE LTD (SG)