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

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.

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

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

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

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

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

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

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 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 + <unk>.
  • 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.

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

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.

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 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.
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 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.
NotesPython 2Python 3
import xmlrpclibimport xmlrpc.client
import DocXMLRPCServer <br> import SimpleXMLRPCServerimport xmlrpc.server
  • Modul lain

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

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

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

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

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

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

NotesPython 2Python 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) <unk>. Anda juga boleh memanggil fungsi ini secara langsung dengan menambahkan tanda bintang (((*Dalam Python 3, fungsi apply ((() tidak lagi wujud; tanda bintang mesti digunakan.

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

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

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

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

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

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

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

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

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

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

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) 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、__dict__attribute ((asl func_dict) adalah ruang nama yang menyokong sifat fungsi yang boleh dipilih.
5、__closure__attribute ((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.

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

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

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.

NotesPython 2Python 3
aClassInstance.aClassMethod.im_funcaClassInstance.aClassMethod._func_
aClassInstance.aClassMethod.im_selfaClassInstance.aClassMethod._self_
aClassInstance.aClassMethod.im_classaClassInstance.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 menentukan__nonzero__() 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 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 objek kelas apabila ia digunakan dalam konteks BULL__bool__(), bukan__nonzero__()。
    2 , bagaimanapun, jika anda mempunyai satu yang ditakrifkan menggunakan dua parameter__nonzero__() 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.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    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.

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

NotesBeforeAfter
a ,ba, 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 mempunyai jenis Bull yang benar sehingga Python 2.3, jadi pemaju menggunakan 1 dan 0 sebagai pengganti.

Skrip 2to3 secara lalai tidak akan melakukan pembaikan untuk prosedur ini. Untuk mengaktifkan fungsi ini, tentukan -f idioms parameter semasa memanggil 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)

Dipetik dari:Blog CSDN

Bagaimana untuk menukar kod Python2 ke kod Python3

Bagaimana untuk menukar kod Python 2.x kepada kod Python 3.x.
Cara menukar kod Python 2.x ke kod Python 3.x

  • 1. Mengubahnya secara manual

Ini tidak perlu banyak, jika ia hanya melibatkan fungsi yang sedikit, seperti print dan sebagainya.

Jadi, anda boleh mengubah kod anda sendiri.

  • 2. Menggunakan Python built-in (Python script) untuk membantu anda menukar secara automatik

Versi Python 2.x, seperti Python 2.7.2 yang saya pasang, mempunyai beberapa alat yang berguna yang disertakan setelah dimuat turun dan dipasang di windows.

Salah satu daripadanya, yang dipanggil 2to3.py, adalah untuk membantu anda mengimplementasikan dan mengubah kod Python 2.x kepada kod Python 3.x.

Ia terletak di: Daftar akar pemasangan Python \ Python27 \ Tools \ Scripts \ 2to3.py

Cara menggunakan 2to3.py untuk menukar kod Python 2.x ke kod Python 3.x
Contohnya, saya mempunyai skrip Python 2.x:

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

Sekarang, kod untuk menukarnya kepada Python 3.x.

Anda boleh membuka cmd windows, letakkan di bawah skrip yang ingin ditukar, dan jalankan

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

Hasilnya ialah:

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 masa ini, anda boleh melihat bahawa 34563264_data_from_site.py telah menjadi kod Python 3.x.

Berbanding kedua-duanya, anda boleh melihat perbezaannya:

img

Untuk 2to3.py sendiri, anda boleh melihat lebih banyak kegunaan 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

Saya hanya mahu menjelaskan beberapa perkara:

(1) Jika tidak ditambah -w parameter di atas, secara lalai hanya akan mencetak kandungan diff yang sepadan dengan proses penukaran untuk output ke tetingkap semasa.

(2) Tambah -w, iaitu mengubah kandungan dan menulis semula ke dokumen asal.

(3) Jika anda tidak mahu menghasilkan fail bak, tambah -n.

(4) Jika anda tidak mahu melihat banyak output, tambahlah no-diffs.

Yang lain, tidak banyak diperkenalkan. Yang berminat boleh teruskan sendiri.

Penggunaan 2 to 3 di atasDalam perjalanan

Jika ada kesilapan, sila 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)