Perubahan antara Python 2.x.x dan Python 3.x.x & Cara menukar Python 2.x.x kepada Python 3.x.x

Dicipta dalam: 2016-10-09 12:36:49, dikemas kini pada: 2017-10-11 10:18:05
comments   2
hits   4926

Perbezaan dan perubahan bahasa antara python2 dan python3

Hampir semua program Python 2 memerlukan beberapa perubahan untuk berfungsi dengan baik di dalam persekitaran Python 3. Untuk memudahkan proses penukaran, Python 3 mempunyai skrip utiliti sendiri yang dipanggil 2to3 (Utility Script), yang mengambil fail sumber program Python 2 anda sebagai input dan kemudian secara automatik mengubahnya ke dalam bentuk Python 3. Kajian kes: memindahkan chardet ke Python 3 (porting chardet to Python 3) menggambarkan bagaimana skrip ini berfungsi, dan kemudian menunjukkan beberapa keadaan di mana ia tidak dapat diperbaiki secara automatik.

  • #### print ayat

Dalam Python 2, print adalah satu pernyataan. Apa sahaja yang anda mahu output, anda boleh meletakkan ia di belakang kata kunci print. Dalam Python 3, print () adalah fungsi. Seperti fungsi lain, print () memerlukan anda untuk menyampaikan apa yang anda mahu output sebagai parameter.

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 mengeluarkan baris kosong, anda perlu memanggil print tanpa parameter.
  2. Untuk menghasilkan nilai yang berasingan, anda perlu mengambil nilai ini sebagai argumen print ().
  3. Untuk output, gunakan dua nilai yang dipisahkan dengan ruang, dengan dua argumen yang dipanggil print (). Dalam Python 2, jika anda menggunakan koma ((,) sebagai penghujung frasa print, ia akan memisahkan hasil output dengan ruang kosong, dan kemudian mengeluarkan ruang kosong yang diikuti ((trailing space), tanpa mengeluarkan balik kereta ((carriage return)). Dalam Python 3, kesan yang sama boleh dicapai dengan memberikan end=’ ‘ sebagai argumen kata kunci kepada print. Dalam Python 2, anda boleh melakukan fungsi yang sama dengan menggunakan sintaks >>pipe_name untuk mengalihkan output ke dalam satu paip, seperti sys.stderr. Dalam Python 3, anda boleh melakukan fungsi yang sama dengan memindahkan paip sebagai nilai file parameter kata kunci ke print (). Nilai default file parameter adalah std.stdout, jadi menetapkan semula nilainya akan menyebabkan output print () ke dalam paip lain.
  • #### Senar Unicode

Python 2 mempunyai dua jenis rentetan:Senar UnicodedanSenar bukan UnicodePython 3 hanya mempunyai satu jenis:Senar Unicode

Notes Python 2 Python 3
u’PapayaWhip’ ‘PapayaWhip’
ur’PapayaWhip\foo’ r’PapayaWhip\foo’

Senar Unicode dalam Python 2 adalah senar biasa dalam Python 3, kerana senar dalam Python 3 sentiasa dalam bentuk Unicode 。 Senar Unicode Asli ((raw string)) ((Python tidak akan menterjemahkan garisan terbalik secara automatik menggunakan senar ini “”) juga digantikan dengan senar biasa, kerana dalam Python 3, semua senar asal dikodkan dalam Unicode .

  • #### Fungsi global (unicode)

Python 2 mempunyai dua fungsi global yang boleh memaksa objek untuk ditukar menjadi senar: unicode ((() untuk menukar objek menjadi senar Unicode, dan str ((() untuk menukar objek menjadi senar bukan Unicode. Python 3 hanya mempunyai satu jenis senar, senar Unicode, jadi str ((() berfungsi untuk semua fungsi.Fungsi unicode ((() tidak lagi wujud dalam Python 3.)

Notes Python 2 Python 3
unicode(anything) str(anything)
  • #### long bentuk bulat

Python 2 mempunyai jenis int dan long yang disediakan untuk nombor bukan floating point. Maksimum jenis int tidak boleh melebihi sys.maxint, dan nilai maksimum ini adalah berkaitan dengan platform. Anda boleh menentukan integer panjang dengan melampirkan L di akhir nombor, yang jelas, ia lebih luas daripada jumlah yang ditunjukkan oleh jenis int.

Baca lebih lanjut: PEP 237: Kesatuan bentuk bulat dan bulat.

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 dalam Python 2 telah digantikan dengan integer biasa dalam desimal dalam Python 3. Integer panjang enam belas digit dalam Python 2 digantikan dengan integer biasa enam belas digit dalam Python 3. Dalam Python 3, format panjang tidak lagi wujud.Tidak ada fungsi long ((() semula jadi. Untuk memaksa penukaran satu pembolehubah kepada bentuk bulat, fungsi int ((() boleh digunakan。 Memeriksa sama ada pembolehubah adalah integer, mendapatkan jenis datanya, dan membandingkannya dengan jenis int ((bukan long)). Anda juga boleh menggunakan fungsi insinstance ((() untuk memeriksa jenis data; untuk menekankan lagi, gunakan int, dan bukan long, untuk memeriksa jenis nombor bulat。

  • #### <> Bandingkan operator

Python 2 menyokong <> sebagai sinonim dengan!=. Python 3 hanya menyokong!=, tidak lagi menyokong <>.

Notes Python 2 Python 3
if x <> y: if x != y:
if x <> y<> z: if x != y!= z:

1 , buat perbandingan sederhana. 2. Perbandingan antara tiga nilai yang agak rumit.

  • #### kaedah has_key()

Dalam Python 2, objek kamus mempunyai_key() kaedah untuk menguji apakah kamus mengandungi kekunci tertentu ((key) ➜ Python 3 tidak lagi menyokong kaedah 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 mudah.
  2. Operator or mempunyai keutamaan yang lebih rendah daripada operator in, jadi anda tidak perlu menambahkan tanda kurung disini.
  3. Sebaliknya, untuk sebab yang sama, or mempunyai keutamaan yang lebih rendah daripada in, di mana anda perlu menambah tanda kurung. Perhatikan: kod di sini adalah sama sekali berbeza daripada baris sebelumnya. Python akan menafsirkan x atau y, dan mendapat hasil x (jika x adalah benar dalam konteks Boolean) atau y._sebuah kunci dictionary。) Operator in mempunyai keutamaan yang lebih rendah daripada operator +, jadi bentuk ini dalam kod tidak memerlukan tanda kurung secara teknikal, tetapi 2to3 ditambahkan.
  4. Bentuk ini memerlukan tanda kurung kerana in mempunyai keutamaan yang lebih rendah daripada + .
  • #### Metode kelas kamus yang mengembalikan senarai

Dalam Python 2, banyak kaedah kelas kamus yang dikembalikan adalah senarai. Di antara kaedah yang paling biasa digunakan, terdapat kunci, item, dan nilai. Dalam Python 3, semua kaedah di atas dikembalikan kepada pandangan dinamik. Dalam beberapa konteks, perubahan ini tidak memberi kesan. Jika nilai yang dikembalikan dari kaedah tersebut dihantar segera ke fungsi lain, dan fungsi itu akan melalui keseluruhan urutan, maka nilai yang dikembalikan oleh kaedah di atas adalah senarai atau pandangan dan tidak akan menghasilkan apa-apa perbezaan. Dalam beberapa kes lain, perubahan ini sangat penting dalam Python 3.

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 menukar nilai pulangan keys () ke dalam senarai statik, untuk pertimbangan keselamatan, 2to3 mungkin akan melakukan kesalahan. Kod seperti itu berkesan, tetapi ia kurang cekap untuk menggunakan pandangan. Anda harus memeriksa kod selepas penukaran untuk melihat sama ada anda memerlukan senarai, mungkin pandangan juga dapat melakukan tugas yang sama. 2 , ini adalah satu lagi cara untuk melihat () tentang item () kaedah) untuk menukar ke dalam senarai △ 2to3 untuk nilai () kaedah untuk menukar nilai kembali sama △ 3 , Python 3 tidak lagi menyokong iterkeys (((). Jika perlu, gunakan iter ((() untuk menukar nilai pulangan keys ((() menjadi iterator. 4, 2to3 dapat mengenal pasti kaedah iterkeys () yang digunakan dalam analisis senarai, dan kemudian mengubahnya menjadi kaedah keys () di Python 3 tanpa memerlukan penggunaan iter tambahan () untuk membungkus nilai pulangnya). Ini boleh dilakukan kerana pandangan itu boleh diulang. 5 2to3 juga dapat mengiktiraf bahawa nilai pulangan kaedah keys (()) dihantar segera ke fungsi lain yang akan melalui keseluruhan urutan, jadi tidak perlu mengubah nilai pulangan keys (()) ke dalam senarai. Sebaliknya, fungsi min ((() akan dengan senang hati melalui pandangan. Proses ini sama berkesan untuk min (((), max (((), jumlah (((), senarai (((), tuple (((), set (((), disusun (((), any ((() dan semua ((().
  • #### Modul yang dinamakan semula atau disusun semula

Dari Python 2 ke Python 3, beberapa modul dalam standard curry telah dinamakan semula. Beberapa modul yang berkaitan antara satu sama lain juga telah digabungkan atau disusun semula untuk menjadikan hubungan ini lebih logik.

  • http Dalam Python 3, beberapa modul HTTP yang berkaitan disatukan dalam satu pakej yang berasingan, iaitu 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 mewujudkan perpustakaan asas yang boleh digunakan untuk meminta sumber HTTP dan menguraikan tindak balas HTTP. Modul http.cookies menyediakan antara muka Python untuk mendapatkan kuki yang dihantar melalui header HTTP Set-Cookie Penyemak imbas yang popular akan menyimpan kuki dalam bentuk fail pada cakera, dan modul http.cookiejar boleh mengendalikan fail-fail tersebut. Modul http.server mewujudkan pelayan HTTP asas

  • urllib Python 2 mempunyai beberapa modul untuk menganalisis, mengkod dan mendapatkan URL, tetapi modul-modul ini saling bertindih seperti sarang tikus. Dalam Python 3, modul-modul ini telah direkonstruksi dan dikombinasikan menjadi satu pakej yang berasingan, iaitu 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

Sebelum ini, modul urllib dalam Python 2 mempunyai pelbagai fungsi, termasuk urlopen () untuk mendapatkan data, dan juga berguna untuk membahagikan URL ke dalam komponen-komponennya iaitu fungsi splitype () dan splitost () dan splituser (). Dalam pakej urllib yang baru, fungsi-fungsi ini disusun dengan lebih logik. 2to3 akan mengubah panggilan fungsi ini untuk menyesuaikan dengan skim penamaan baru. Dalam Python 3, modul urllib2 yang terdahulu telah digabungkan ke dalam pakej urllib. Pada masa yang sama, pelbagai perkara kegemaran anda dalam urllib2 akan muncul secara berterusan dalam modul urllib Python 3, seperti build_Opener () kaedah, Request object, HTTPBasicAuthHandler dan friends。 Modul urllib.parse dalam Python 3 mengandungi semua fungsi parse urlparse dalam Python 2. Modul urllib.robotparse menguraikan fail robots.txt. Kelas FancyURLopener yang menangani pengalihan HTTP dan kod status lain masih berfungsi dalam modul urllib.request di Python 3. Fungsi △ urlencode △ telah dipindahkan ke urllib.parse. Objek permintaan masih sah dalam urllib.request, tetapi kekaburan seperti HTTPError telah dipindahkan ke urllib.error. Adakah saya menyebut bahawa 2to3 juga akan menulis semula panggilan fungsi anda? Sebagai contoh, jika anda mengimport modul urllib ke dalam kod Python 2 anda, dan memanggil fungsi urllib.urlopen ((() untuk mendapatkan data, 2to3 akan mengedit kata import dan panggilan fungsi pada masa 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 klon DBM kini terdapat dalam satu pakej yang berasingan, iaitu dbm. Jika anda memerlukan varian tertentu, seperti GNUDBM, anda boleh mengimport modul yang sesuai dalam pakej 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 kaedah kelas ringan untuk melakukan panggilan RPC jauh melalui protokol HTTP. Beberapa perpustakaan pelaksanaan XML-RPC klien dan XML-RPC server kini dikumpulkan ke dalam pakej berasingan, iaitu xmlrpc.
Notes Python 2 Python 3
import xmlrpclib import xmlrpc.client
import DocXMLRPCServer
import SimpleXMLRPCServer
import xmlrpc.server
  • #### Modul lain
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. Dalam Python 2, anda biasanya akan melakukan ini, cuba untuk mengimport cStringIO sebagai pengganti StringIO terlebih dahulu, dan jika gagal, import StringIO. Jangan lakukan ini dalam Python 3; modul io akan membantu anda dalam hal ini. Ia akan mencari cara terpantas yang boleh digunakan untuk mengimplementasikannya, dan menggunakannya secara automatik.
  2. Dalam Python 2, mengimport pelaksanaan pickle yang paling cepat adalah cara yang sama seperti di atas. Dalam Python 3, modul pickle akan menguruskannya secara automatik untuk anda, jadi jangan lakukan lagi. Modul builtins mengandungi fungsi global, kelas, dan malar yang digunakan di seluruh bahasa Python. Mendefinisikan fungsi tertentu dalam modul builtins bermaksud mendefinisikan fungsi global ini di mana-mana. Kedengarannya kuat, tetapi juga menakutkan.
  3. Modul copyreg menambah sokongan untuk modul pickle untuk jenis kustom pengguna yang ditakrifkan dalam bahasa C.
  4. Modul queue mewujudkan satu barisan pengeluar-pengguna (multi-producer, multi-consumer queue).
  5. Modul socketserver menyediakan kelas asas umum untuk melaksanakan pelbagai jenis pelayan soket.
  6. Modul configparser digunakan untuk menguraikan fail konfigurasi INI-style. Modul reprlib merealisasikan semula fungsi repr () yang terbina dalam, dan menambah kawalan ke atas panjang yang ditunjukkan oleh senar sebelum dipotong. Modul subprocess membolehkan anda membuat subproses, menyambung ke paip mereka, dan mendapatkan nilai pulangan mereka.
  • Impor relatif dalam pakej

Pakej adalah satu entiti yang terdiri daripada sekumpulan modul yang berkaitan. Dalam Python 2, anda akan menggunakan import foo atau from foo import Bar untuk membuat rujukan antara modul dalam pakej yang sama. Penerjemah Python 2 akan mencari foo.py di direktori semasa, dan kemudian mencari di laluan carian Python (sys.path).

Katakan anda mempunyai beberapa fail dalam satu direktori seperti berikut:

chardet/ | +–init.py | +–constants.py | +–mbcharsetprober.py | +–universaldetector.py

Sekarang andaikan universaldetector.py memerlukan import keseluruhan constants.py, dan juga memerlukan import satu kelas untuk mbcharsetprober.py. Bagaimana anda akan melakukannya?

Notes Python 2 Python 3
import constants from .import constants
from mbcharsetprober import MultiByteCharSetProber from .mbcharsetprober import MultiByteCharsetProber

Apabila anda perlu mengimport keseluruhan modul dari tempat lain dalam pakej, gunakan sintaks baru dari .import. Dalam contoh ini, kedua-dua fail ini berada dalam direktori yang sama, jadi anda menggunakan satu kalimat. Anda juga boleh mengimport dari direktori induk (dari .. import anothermodule) atau dari subdirektori. 2. Untuk mengimport kelas atau fungsi tertentu dari modul lain ke ruang nama modul anda, tambahkan laluan relatif ke nama modul yang perlu diimport, dan hilangkan garis miring terakhir ((slash) Dalam contoh ini, mbcharsetprober.py dan universaldetector.py berada dalam direktori yang sama, jadi nama laluan relatif adalah satu tanda baca. Anda juga boleh mengimport dari direktori induk ((from .. import anothermodule) atau dari subdirektori

  • #### Kaedah iterator (next)

Dalam Python 2, iterator mempunyai kaedah next () untuk mengembalikan item seterusnya dalam urutan. Ini juga berlaku dalam Python 3, tetapi sekarang terdapat 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 mudah, anda tidak lagi memanggil kaedah next (() iterator, dan anda kini menghantar iterator itu sendiri sebagai parameter kepada fungsi global next (() }}. 2. Jika anda mempunyai nilai yang dikembalikan sebagai fungsi iterator, panggil fungsi ini dan serahkan hasilnya sebagai parameter kepada fungsi next ((((skrip 2to3 cukup pintar untuk melakukan penukaran ini dengan betul. 3. Jika anda ingin mendefinisikan kelas anda sendiri dan menggunakannya sebagai iterator, dalam Python 3, anda boleh menggunakan kaedah khusus dengan mendefinisikannext() untuk mencapai. 4. Jika kelas yang anda tentukan mempunyai next () dan ia menggunakan satu atau lebih parameter, ia tidak akan bergerak semasa pelaksanaan 2 hingga 3. Kelas ini tidak boleh digunakan sebagai iterator, kerana kaedah next () mempunyai parameter. 5. Ini agak rumit. Jika anda kebetulan mempunyai pembolehubah tempatan yang dipanggil next, ia akan mendapat keutamaan lebih tinggi dalam Python 3 daripada fungsi global next ((() }}. Dalam kes ini, anda perlu memanggil kaedah khas iterator.next() untuk mendapatkan elemen seterusnya dalam urutan。(atau, anda juga boleh menyusun semula kod supaya nama pembolehubah tempatan tidak dipanggil next, tetapi 2to3 tidak akan melakukan ini untuk anda。)

  • #### Filter fungsi global

Dalam Python 2, kaedah filter() mengembalikan senarai yang diperolehi dengan fungsi yang mengembalikan nilai True atau False untuk memeriksa setiap elemen dalam urutan. Dalam Python 3, fungsi filter() mengembalikan iterator, bukan lagi senarai.

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 kes yang paling mudah, 2to3 akan menggunakan fungsi list () untuk membungkus filter () dan fungsi list () akan melalui parameternya dan mengembalikan senarai. 2 , Walau bagaimanapun, jika filter() panggilan telah di bungkus oleh list(), 2to3 tidak akan memprosesnya lagi, kerana dalam kes ini tidak penting sama ada nilai yang dikembalikan oleh filter() adalah iterator. 3 , Untuk menangani sintaks khusus filter ((None, …) 2 to 3 akan menukar panggilan ini dari setara sintaks ke dalam analisis senarai. 4. Oleh kerana kitaran for akan melalui keseluruhan urutan, tidak perlu mengubahsuai lagi. 5. Sama seperti di atas, tidak perlu dilakukan perubahan, kerana analisis senarai akan melalui keseluruhan urutan, walaupun filter ((() mengembalikan sebuah iterator, ia masih boleh berfungsi seperti filter ((() yang sebelumnya mengembalikan senarai.

  • #### Fungsi global map ((()

Seperti perubahan pada filter, fungsi map kini mengembalikan sebuah iterator. Dalam Python 2, ia mengembalikan sebuah senarai.

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 , sama dengan penanganan filter ((), dalam kes yang paling mudah, 2to3 akan menggunakan fungsi list (() untuk membungkus panggilan map ((). 2. Untuk sintaks map ((None, …), seperti filter ((None, …), 2to3 akan mengubahnya menjadi panggilan setara yang menggunakan list ((). 3, jika parameter pertama map () adalah fungsi lambda, 2to3 akan menukarnya secara ekuivalen ke dalam analisis senarai. 4. Tidak perlu melakukan perubahan untuk kitaran for yang akan melalui keseluruhan urutan. 5. Sekali lagi, tidak perlu melakukan perubahan di sini, kerana analisis senarai akan melalui keseluruhan urutan, walaupun nilai pulangan map () adalah iterator dan bukan senarai, ia akan berfungsi dengan baik.

  • #### Fungsi global mengurangkan ()

Dalam Python 3, fungsi reduce ((() telah dikeluarkan dari ruang nama global dan kini diletakkan 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 mempunyai fungsi global yang dipanggil apply (), yang menggunakan fungsi f dan senarai.[a, b, c] sebagai argumen, nilai yang dikembalikan ialah f ((a, b, c) . Anda juga boleh memanggil fungsi ini secara langsung dengan menambahkan tanda bintang (((*Dalam Python 3, fungsi apply ((() tidak lagi wujud; tanda bintang mesti digunakan.

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 mudah, boleh melalui dalam senarai parameter ((seperti[a, b, c]) sebelum menambah tanda bintang untuk memanggil fungsi ≠. Ini sama dengan fungsi apply ((() dalam Python 2. 2 In Python 2, apply() fungsi sebenarnya boleh membawa 3 argumen: satu fungsi, satu senarai argumen, dan satu argumen penamaan kamus. Dalam Python 3, anda boleh dengan menambah tanda bintang sebelum senarai argumen), tambah dua tanda bintang di hadapan argumen penamaan kamus ((**Ia juga boleh digunakan untuk tujuan yang sama. 3. Operator + digunakan di sini sebagai fungsi untuk menyambungkan senarai, ia mempunyai keutamaan yang lebih tinggi daripada operator, jadi tidak perlu menambah tanda kurung tambahan di sekitar a_list_of_args + z. Skrip 2 ke 3 cukup pintar untuk menukar panggilan apply () yang rumit, termasuk fungsi yang dipanggil dalam modul import.

  • #### Fungsi global (intern)

Dalam Python 2, anda boleh menggunakan fungsi intern () untuk membatasi () fungsi intern () pada satu senar untuk mencapai pengoptimuman prestasi. Dalam Python 3, fungsi intern () telah dipindahkan ke modul sys.

Notes Python 2 Python 3
intern(aString) sys.intern(aString)
  • #### Perkataan exec

Sama seperti pernyataan print menjadi fungsi dalam Python 3, pernyataan exec adalah sedemikian. Fungsi。exec() menggunakan string yang mengandungi kod Python yang dipilih sebagai parameter, dan kemudian mengeksekusinya seperti menjalankan pernyataan atau ungkapan.。exec() adalah serupa dengan eval(), tetapi exec() lebih kuat dan lebih mahir.。eval() fungsi hanya dapat melaksanakan satu ungkapan tunggal, tetapi exec() dapat menjalankan beberapa pernyataan, import, dan pengisytiharan fungsi.

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 mudah, kerana exec (() kini merupakan fungsi dan bukan pernyataan, 2to3 akan mengelilingi kod dalam bentuk senar ini dengan tanda kurung. 2. Perkataan exec dalam Python 2 boleh menentukan ruang nama, dan kod akan dijalankan dalam ruang peribadi yang terdiri daripada objek global. Python 3 juga mempunyai fungsi seperti itu; anda hanya perlu menyampaikan ruang nama ini sebagai parameter kedua kepada fungsi exec (). 3. Lebih ajaibnya lagi, pernyataan exec di Python 2 juga boleh menentukan ruang nama tempatan (seperti pembolehubah yang diisytiharkan dalam fungsi). Di Python 3, fungsi exec () juga mempunyai fungsi seperti itu.

  • #### Pernyataan execfile

Seperti kata-kata exec sebelumnya, kata-kata execfile dalam Python 2 juga boleh menggunakan string seperti menjalankan kod Python. Perbezaan antara exec menggunakan string, sedangkan execfile menggunakan file. Dalam Python 3, kata-kata execfile telah dihapuskan. Jika anda benar-benar ingin menjalankan kod Python dalam satu fail tetapi anda tidak mahu mengimpornya, anda boleh membacanya dengan membuka fail itu, membaca isinya, dan memanggil fungsi compile () untuk memaksa Python interpreter untuk mengkompilasi kod, dan memanggil fungsi exec () yang baru.

Notes Python 2 Python 3
execfile(‘a_filename’) exec(compile(open(‘a_filename’).read(),‘a_filename’,‘exec’))
  • #### repr (dalam tanda kutip)

Dalam Python 2, untuk mendapatkan string yang mewakili objek arbitrer, ada cara untuk membungkus objek dalam tanda petik ((sepertixDalam Python 3, keupayaan ini masih wujud, tetapi anda tidak boleh lagi menggunakan tanda petik untuk mendapatkan rentetan ini. Anda perlu menggunakan fungsi global repr ((() }}.

Notes Python 2 Python 3
`x` repr(x)
`‘PapayaWhip’ + `2`` repr(‘PapayaWhip’+ repr(2))
  1. Ingat, x boleh menjadi apa-apa: kelas, fungsi, modul, jenis data asas, dan lain-lain.
  2. Dalam Python 2, tanda petik balik boleh disematkan, menyebabkan ungkapan yang membingungkan (tetapi berkesan). 2to3 cukup pintar untuk menukar panggilan disematkan ini kepada fungsi repr ().
  • #### cuba…except ayat

Dari Python 2 ke Python 3, sintaks untuk menangkap kecacatan sedikit berubah.

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。 berbanding dengan Python 2 yang menambahkan koma selepas jenis pengecualian. 2. Kata kunci as juga boleh digunakan untuk menangkap pelbagai jenis keabnormalan dalam satu masa. 3. Jika anda menangkap satu pengecualian, tetapi anda tidak mahu mengakses objek pengecualian itu sendiri, Python 2 dan Python 3 mempunyai sintaks yang sama. 4 , Begitu juga, jika anda menggunakan kaedah perlindungan ((fallback) untuk menangkap semua pengecualian, sintaks Python 2 dan Python 3 adalah sama. 5. Apabila mengimport modul (atau dalam kebanyakan kes lain), anda tidak boleh menggunakan kaedah ini (lihat fallback di atas). Jika tidak, program mungkin akan menangkap kecacatan seperti KeyboardInterrupt (jika pengguna mengganggu program dengan menekan Ctrl-C), yang akan membuat debug menjadi lebih sukar.

  • #### Ungkapan raise

Dalam Python 3, terdapat sedikit perubahan dalam sintaks untuk mengeluarkan pengecualian tersuai.

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. Mengeluarkan pengecualian tanpa mesej ralat yang disesuaikan oleh pengguna, dalam bentuk paling mudah ini, tatabahasa tidak berubah. 2 , perubahan adalah jelas apabila anda ingin mengeluarkan pengecualian dengan mesej ralat yang disesuaikan oleh pengguna. Python 2 menggunakan koma untuk memisahkan kelas pengecualian dan mesej ralat; Python 3 menyampaikan mesej ralat kepada kelas pengecualian sebagai parameter.
  2. Python 2 menyokong sintaks yang lebih rumit untuk mengeluarkan pengecualian dengan jejak tumpukan yang disesuaikan oleh pengguna. Anda juga boleh melakukannya di Python 3, tetapi ia adalah sintaks yang berbeza.
  3. Di Python 2, anda boleh membuang satu pengecualian tanpa kelas pengecualian, hanya satu mesej pengecualian. Di Python 3, bentuk ini tidak lagi disokong. 2to3 akan memberi amaran kepada anda bahawa ia tidak dapat membetulkan sintaks ini secara automatik.
  • #### Kaedah Throw Generator

Dalam Python 2, penjana mempunyai kaedah “throw”). Perkataan a_generator.throw () akan mengeluarkan pengecualian apabila penjana ditangguhkan, dan kemudian mengembalikan nilai seterusnya yang diambil oleh fungsi penjana. Dalam Python 3, fungsi ini masih tersedia, tetapi sedikit berbeza dalam sintaksis.

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 yang paling mudah, penjana mengeluarkan pengecualian tanpa mesej ralat yang disesuaikan oleh pengguna. Dalam kes ini, tidak ada perubahan dalam sintaksis dari Python 2 ke Python 3.
  2. Jika penjana mengeluarkan pengecualian yang membawa mesej ralat yang disesuaikan oleh pengguna, anda perlu menghantar string ralat ini ke kelas pengecualian untuk menginstansikannya. 3 , Python 2 juga menyokong pengecualian yang hanya mengeluarkan maklumat mengenai pengecualian. Python 3 tidak menyokong sintaks ini, dan 2to3 akan memaparkan mesej amaran yang memberitahu anda bahawa anda perlu memperbaiki kod ini secara manual.
  • #### Fungsi global xrange ()

Dalam Python 2, terdapat dua cara untuk mendapatkan nombor dalam julat tertentu: range (((), yang mengembalikan senarai, dan range (((), yang mengembalikan iterator. Dalam Python 3, range ((() mengembalikan iterator, dan xrange ((() tidak lagi wujud.

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 kes yang paling mudah, 2to3 akan menukar xrange () menjadi range () 2 , Jika kod Python 2 anda menggunakan range (), 2to3 tidak tahu sama ada anda memerlukan senarai atau sama ada iterator berfungsi. Sebagai langkah berjaga-jaga, 2to3 mungkin membuat kesalahan dan kemudian menggunakan list () untuk memaksa nilai yang dikembalikan dari range () ke dalam jenis senarai. 3. Jika terdapat fungsi xrange () dalam analisis senarai, tidak perlu menukar nilai pulangan ke dalam senarai, kerana analisis senarai sama berkesan untuk iterator. 4. Begitu juga, kitaran for juga berfungsi pada iterator, jadi tidak ada perubahan di sini. Fungsi sum ((() berfungsi sebagai iterator, jadi 2to3 tidak melakukan perubahan di sini. Sama seperti kaedah kelas kamus yang mengembalikan nilai sebagai pandangan (((view) dan bukan senarai, ini juga berlaku untuk min (((), max (((), sum (((), list (((), tuple (((), set (((), sorted (((), any (((), all (())

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

Python 2 mempunyai dua fungsi global yang digunakan untuk meminta input pengguna di baris perintah. Yang pertama dipanggil input (), yang menunggu pengguna memasukkan ungkapan Python (), dan kemudian mengembalikan hasilnya (). Yang kedua dipanggil raw_input (), dan apa yang dimasukkan pengguna dikembalikan ().

Notes Python 2 Python 3
raw_input() input()
raw_input(‘prompt’) input(‘prompt’)
input() eval(input())

1 , Raw_input (() telah digantikan dengan input (()) dalam bentuk paling mudah. 2. Di Python 2, fungsi raw_input ((() boleh menetapkan tanda petunjuk sebagai argumen. Di Python 3, fungsi ini dikekalkan. 3. Jika anda benar-benar ingin meminta pengguna memasukkan ungkapan Python dan mengira hasilnya, anda boleh memanggil fungsi input () dan menghantar nilai yang dikembalikan kepada eval ()

  • #### Sifat fungsi

Dalam Python 2, kod fungsi mempunyai akses ke sifat-sifat khas fungsi itu sendiri. Dalam Python 3, sifat-sifat khusus ini dinamakan semula untuk kesesuaian.

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) mengandungi nama fungsi。 2、doc atribut ((aslifuncdoc) mengandungi senar dokumen yang anda tentukan dalam kod sumber fungsi ((docstring) 3、defaults sifat ((aslifunc_defaults) adalah satu subset yang menyimpan nilai lalai parameter. 4、dictattribute ((asl func_dict) adalah ruang nama yang menyokong sifat fungsi yang boleh dipilih. 5、closureattribute ((asl func_closure) adalah satu subset yang terdiri daripada objek cell, yang mengandungi ikatan fungsi kepada pembolehubah bebas ((free variable)). 6、globals sifat ((asl function_globals) adalah rujukan kepada ruang nama global modul, fungsi itu sendiri ditakrifkan dalam ruang nama tersebut. 7、code sifat ((aslifunc_code) adalah objek kod yang mewakili fungsi yang dikompilasi.

  • #### I/O kaedah xreadlines

Dalam Python 2, objek fail mempunyai kaedah xreadlines () yang mengembalikan iterator yang membaca satu baris fail sekali. Ini sangat berguna dalam kitaran for. Sebenarnya, versi Python 2 kemudian menambah fungsi ini kepada objek fail itu sendiri.

Dalam Python 3, kaedah xreadlines () tidak lagi boleh digunakan. 2to3 boleh menyelesaikan keadaan mudah, tetapi beberapa kes pinggir memerlukan campur tangan tangan tangan.

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 memanggil xreadlines tanpa parameter sebelumnya (), 2to3 akan mengubahnya menjadi objek fail itu sendiri. Dalam Python 3, kod selepas penukaran ini dapat melakukan tugas yang sama seperti sebelumnya: membaca baris fail sekali, dan kemudian melakukan lingkaran lingkaran for. 2, jika anda menggunakan argumen ((bilangan baris setiap kali dibaca) untuk memanggil xreadlines ((), 2to3 tidak dapat menyelesaikan penukaran dari Python 2 ke Python 3 untuk anda, kod anda akan gagal dengan cara ini: AttributeError: ‘_io.TextIOWrapper’ object has no attribute ‘xreadlines’。 anda boleh mengubah xreadlines menjadi readlines secara manual supaya kod anda berfungsi di Python 3。 kaedah readline mengembalikan iterator di Python 3, jadi ia tidak sama dengan xreadlines di Python 2。

  • #### Fungsi lambda yang menggunakan unsur dan bukan pelbagai parameter

Dalam Python 2, anda boleh mentakrifkan fungsi lambda tanpa nama (anonymous lambda function) yang membolehkan fungsi ini menerima pelbagai parameter dengan menetapkan nombor elemen dalam satu subset sebagai argumen. Sebenarnya, penterjemah Python 2 mengurai subset ini menjadi argumen bernama (named arguments), dan anda boleh merujuknya dalam fungsi lambda (they are named). Dalam Python 3, anda masih boleh menghantar subset sebagai argumen untuk fungsi lambda, tetapi penterjemah Python tidak akan menguraikannya sebagai 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

1, jika anda telah mentakrifkan fungsi lambda yang menggunakan satu unsur yang mengandungi satu unsur sebagai argumen, dalam Python 3, ia akan ditukarkan kepada satu yang mengandungi x1[Fungsi lambda yang dirujuk oleh 0] ialah。x1 yang dihasilkan secara automatik oleh skrip 2to3 berdasarkan parameter penamaan dalam subset asal。 Fungsi lambda yang menggunakan subset yang mengandungi dua elemen ((x, y) sebagai parameter ditukarkan kepada x_y, yang mempunyai dua parameter kedudukan, iaitu x_y[0] dan x_y[1]。 Skrip 3, 2to3 bahkan boleh menangani fungsi lambda yang menggunakan parameter nama tetingkap sebagai parameter. Kod yang dihasilkan agak sukar untuk dibaca, tetapi ia berfungsi sama di Python 3 dengan kod asal di Python 2. Anda boleh mentakrifkan fungsi lambda yang menggunakan lebih banyak parameter. Python 2 akan menganggapnya sebagai fungsi lambda yang mengandungi lebih banyak parameter jika tidak ada tanda kurung di sekitar parameter; dalam fungsi lambda ini, anda merujuk parameter ini dengan nama, seperti yang dilakukan dalam fungsi jenis lain.

  • #### Sifat-sifat kaedah khusus

Dalam Python 2, kaedah kelas boleh diakses untuk menentukan objek kelas mereka (class object), dan juga boleh diakses oleh objek kaedah (method object) itu sendiri. Im_self adalah objek contoh kelas; im_func adalah objek fungsi, dan im_class adalah kelas itu sendiri. Dalam Python 3, sifat-sifat ini dinamakan semula untuk mengikuti konvensyen penamaan sifat-sifat lain.

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_Kaedah khas

Dalam Python 2, anda boleh membuat kelas anda sendiri dan membolehkan ia digunakan dalam konteks Boolean. Sebagai contoh, anda boleh menjadikan kelas ini sebagai contoh dan menggunakan objek contoh ini dalam pernyataan if. Untuk tujuan ini, anda menentukannonzero() kaedah, ia akan mengembalikan nilai True atau False, kaedah ini akan dipanggil apabila objek contoh berada dalam konteks BULL. Dalam Python 3, anda masih boleh melakukan fungsi yang sama, tetapi nama kaedah khas ini 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 objek kelas apabila ia digunakan dalam konteks BULLbool(), bukannonzero()。 2 , bagaimanapun, jika anda mempunyai satu yang ditakrifkan menggunakan dua parameternonzero() kaedah, skrip 2 to3 akan menganggap bahawa kaedah yang anda tetapkan ini mempunyai kegunaan lain, oleh itu ia tidak akan mengubah kod.

  • #### Jenis sistem lapan

Antara Python 2 dan Python 3, terdapat sedikit perubahan dalam tatabahasa untuk mentakrifkan nombor oktal.

Notes Python 2 Python 3
x = 0755 x = 0o755
  • #### sys.maxint

Oleh kerana integer panjang dan integer telah diintegrasikan bersama, sys.maxint tidak lagi tepat. Tetapi kerana nilai ini berguna untuk mengesan keupayaan platform tertentu, ia disimpan oleh Python 3 dan dinamakan semula sebagai 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 akan berubah menjadi sys.maxsize.

  • #### Fungsi global yang boleh dipanggil

Dalam Python 2, anda boleh menggunakan fungsi global callable ((() untuk memeriksa sama ada objek boleh dipanggil ((callable, seperti fungsi) }}. Dalam Python 3, fungsi global ini telah dibatalkan }}. Untuk memeriksa sama ada objek boleh dipanggil, anda boleh memeriksa kaedah khas__call_Kewujudan ______

Notes Python 2 Python 3
callable(anything) hasattr(anything,’_call_’)
  • #### Fungsi global (zip)

Dalam Python 2, fungsi global zip() boleh menggunakan pelbagai urutan sebagai parameter, dan ia mengembalikan senarai yang terdiri daripada subgrup. Subgrup pertama mengandungi elemen pertama dalam setiap urutan; subgrup kedua mengandungi elemen kedua dalam setiap urutan; dan seterusnya dipindahkan ke bawah. Dalam Python 3, zip() mengembalikan sebuah iterator, bukan senarai.

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 mudah, anda boleh memulihkan fungsi sebelum fungsi zip dengan memanggil nilai yang dikembalikan oleh fungsi paket zip, fungsi list akan melalui iterator yang dikembalikan oleh fungsi zip, dan kemudian mengembalikan senarai hasil. Dalam konteks di mana semua elemen dalam susunan telah dilalui (contohnya di sini adalah panggilan kepada kaedah join), zip () yang dikembalikan oleh iterator dapat berfungsi dengan baik. Skrip 2to3 akan mengesan keadaan ini dan tidak akan mengubah kod anda.

  • #### StandardError luar biasa

Dalam Python 2, StandardError adalah subkelas bagi semua kecacatan terbina dalam selain StopIteration, GeneratorExit, KeyboardInterrupt, dan SystemExit. Dalam Python 3, StandardError telah dibatalkan; ia digantikan dengan Exception.

Notes Python 2 Python 3
x =StandardError() x =Exception()
x =StandardError(a, b, c) x =Exception(a, b, c)
  • #### Kestabilan dalam modul types

Pelbagai jenis konstan dalam modul types membantu anda menentukan jenis objek. Dalam Python 2, ia mengandungi konstan yang mewakili semua jenis data asas, seperti dict dan int. Dalam Python 3, ia telah dibatalkan. Ia hanya perlu digantikan dengan nama jenis asas.

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 sebagai byte dan bukan str, kerana Python 2 dalam a sequence of bytes.

  • #### Instansi fungsi global

isinstance() berfungsi untuk memeriksa sama ada objek adalah contoh dari kelas atau jenis tertentu. Di Python 2, anda boleh menghantar satu subset yang terdiri daripada jenis ke instance, dan jika objek itu adalah jenis apa pun dalam subset, fungsi akan mengembalikan True. Di Python 3, anda masih boleh melakukannya, tetapi tidak disyorkan untuk menggunakan jenis sebagai argumen yang dihantar dua kali.

Notes Python 2 Python 3
isinstance(x,(int,float,int)) isinstance(x,(int,float))
  • #### jenis data basestring

Python 2 mempunyai dua jenis senar: senar yang dikodkan oleh Unicode dan senar yang tidak dikodkan oleh Unicode. Tetapi sebenarnya ada jenis lain, iaitu basestring. Ia adalah jenis data abstrak, iaitu superclass str dan unicode.

Notes Python 2 Python 3
isinstance(x, basestring) isinstance(x, str)
  • #### Modul itertools

Python 2.3 memperkenalkan modul itertools, yang mentakrifkan varian fungsi global zip (), map (), filter (), yang dikembalikan sebagai iterator, bukan senarai. Di Python 3, fungsi varian ini telah dibatalkan kerana fungsi global ini dikembalikan sebagai iterator.

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. Gunakan fungsi zip () global, dan bukannya itertools.izip () 2 , menggunakan map () dan bukan itertools.imap () 3 ,itertools.ifilter() menjadi filter() 。 Modul itertools masih wujud dalam Python 3, tetapi ia tidak lagi mengandungi fungsi yang telah dipindahkan ke ruang nama global. Skrip 2to3 cukup pintar untuk membuang import yang tidak lagi berguna, sambil mengekalkan integriti import lain.
  • #### sys.exc_type, sys.exc_value, sys.exc_traceback

Terdapat tiga pembolehubah dalam modul sys yang boleh anda akses untuk menangani pengecualian: sys.exc_type, sys.exc_value, sys.exc_traceback. (Sebenarnya, ini sudah ada pada zaman Python 1.) Sejak Python 1.5, penggunaan ketiga-tiga pembolehubah ini tidak lagi disyorkan kerana sys.exc_info yang baru dikeluarkan, yang merupakan satu subset yang mengandungi ketiga-tiga elemen di atas.

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]
  • #### Parse senarai untuk unsur

Dalam Python 2, anda tidak perlu meletakkan tanda kurung di sekitar nilai alir jika anda perlu menulis analisis senarai alir. Dalam 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 mempunyai fungsi yang dipanggil os.getcwd (() yang mengembalikan direktori kerja semasa sebagai senar (((tidak dikodkan dalam Unicode)). Oleh kerana sistem fail moden dapat menangani nama direktori yang dikodkan dengan heks, Python 2.3 memperkenalkan fungsi os.getcwdu (()) [2]. Fungsi os.getcwdu (() mengembalikan senar yang dikodkan dalam Unicode dari direktori kerja semasa.

Notes Python 2 Python 3
os.getcwdu() os.getcwd()
  • #### Meta-kelas

Dalam Python 2, anda boleh menentukan parameter metaclass dalam deklarasi kelas, atau anda boleh menentukan peringkat kelas khusus (class-level)metaclass sifat, untuk mencipta subkelas.__metaclass_Atribut _ telah dipadamkan.

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. Mengisytiharkan parameter metaclass semasa mengisytiharkan kelas, yang berlaku dalam Python 2 dan Python 3, yang sama.
  2. Mengisytiharkan sifat metaclass dalam definisi kelas yang sah dalam Python 2, tetapi tidak lagi sah dalam Python 3. 3, 2to3 mampu membina satu deklarasi kelas yang sah walaupun kelas tersebut mewarisi daripada beberapa kelas bapa.
  • #### Mengenai gaya kod

Pembetulan-pembetulan yang disenaraikan di bawah ini pada hakikatnya bukan pembetulan sebenar. Maksudnya, mereka hanya berkaitan dengan gaya kod dan tidak melibatkan kod. Tetapi pemaju Python sangat berminat untuk menjadikan gaya kod selaras mungkin. Untuk itu, terdapat panduan rasmi yang khusus untuk menggambarkan gaya kod Python.

  • #### set{) nilai literal{)

Di Python 2, satu-satunya cara untuk menentukan set nilai literal ialah dengan memanggil set (a_sequence). Ini masih berfungsi di Python 3, tetapi menggunakan notasi baru (literal notation): tanda kurung besar ({}) adalah cara yang lebih jelas.

Skrip 2to3 secara lalai tidak membetulkan set ((() nilai literal. Untuk mengaktifkan fungsi ini, tentukan -f set_literal parameter semasa 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 ((()

Objek Python yang diimplementasikan dengan C boleh mengeksport sebuah buffer interface yang membolehkan kod Python lain membaca dan menulis secara langsung ke dalam memori. Kedengarannya kuat, tetapi ia juga menakutkan. Dalam Python 3, buffer telah dinamakan semula sebagai memoryview. Perubahan sebenar lebih rumit, tetapi anda boleh mengabaikan perbezaan ini.

Skrip 2to3 secara lalai tidak akan membetulkan fungsi buffer (). Untuk mengaktifkan fungsi ini, tentukan -f buffer parameter semasa panggilan baris perintah 2to3.

Notes Before After
x =buffer(y) x =memoryview(y)
  • #### Bilik di sekitar tanda koma (tidak jelas)

Walaupun Python sangat ketat mengenai ruang untuk mengindentifikasi dan memunculkan, Python bebas untuk menggunakan ruang dalam aspek lain. Dalam senarai, subgrup, kumpulan dan kamus, ruang boleh muncul di depan atau di belakang tanda koma, yang tidak akan memberi kesan buruk. Namun, buku panduan gaya kod Python menyatakan bahawa tidak boleh ada ruang sebelum koma, dan koma harus mengandungi ruang. Walaupun ini hanya pertimbangan estetika semata-mata, kod masih boleh berfungsi dengan baik, baik di Python 2 dan Python 3, tetapi skrip 2to3 dapat menyelesaikan pembaikan ini untuk anda berdasarkan standard dalam buku panduan.

Skrip 2to3 secara lalai tidak membetulkan ruang di sekitar tanda koma. Untuk mengaktifkan ini, tentukan -f wscomma parameter semasa panggilan baris perintah 2to3.

Notes Before After
a ,b a, b
{a :b} {a: b}
  • #### Biasa (bahasa biasa)

Terdapat banyak rutin yang telah ditubuhkan dalam komuniti Python. Terdapat beberapa rutin seperti while 1: loop, yang bermula dari Python 1. Python tidak mempun