Keluaran bahasa pengaturcaraan Python 3.11

Selepas setahun pembangunan, keluaran penting bahasa pengaturcaraan Python 3.11 telah diterbitkan. Cawangan baharu akan disokong selama satu setengah tahun, selepas itu selama tiga setengah tahun lagi, pembetulan akan dijana untuk menghapuskan kelemahan.

Pada masa yang sama, ujian alfa cawangan Python 3.12 bermula (mengikut jadual pembangunan baharu, kerja pada cawangan baharu bermula lima bulan sebelum keluaran cawangan sebelumnya dan mencapai peringkat ujian alfa pada masa keluaran seterusnya ). Cawangan Python 3.12 akan berada dalam keluaran alfa selama tujuh bulan, di mana ciri baharu akan ditambah dan pepijat diperbaiki. Selepas ini, versi beta akan diuji selama tiga bulan, di mana penambahan ciri baharu akan dilarang dan semua perhatian akan diberikan untuk membetulkan pepijat. Untuk dua bulan terakhir sebelum keluaran, cawangan akan berada di peringkat calon keluaran, di mana penstabilan akhir akan dilakukan.

Penambahan baharu kepada Python 3.11 termasuk:

  • Kerja penting telah dilakukan untuk mengoptimumkan prestasi. Cawangan baharu termasuk perubahan yang berkaitan dengan pecutan dan penggunaan sebaris bagi panggilan fungsi, penggunaan penterjemah pantas bagi operasi standard (x+x, x*x, xx, a[i], a[i] = z, f(arg) C( arg), o.method(), o.attr = z, *seq), serta pengoptimuman yang disediakan oleh projek Cinder dan HotPy. Bergantung pada jenis beban, terdapat peningkatan dalam kelajuan pelaksanaan kod sebanyak 10-60%. Secara purata, prestasi pada suite ujian pyperformance meningkat sebanyak 25%.

    Mekanisme caching bytecode telah direka bentuk semula, yang telah mengurangkan masa permulaan penterjemah sebanyak 10-15%. Objek dengan kod dan bytecode kini diperuntukkan secara statik oleh penterjemah, yang memungkinkan untuk menghapuskan peringkat unmarshalling bytecode yang diekstrak daripada cache dan menukar objek dengan kod untuk diletakkan dalam memori dinamik.

  • Apabila memaparkan jejak panggilan dalam mesej diagnostik, kini boleh memaparkan maklumat tentang ungkapan yang menyebabkan ralat (sebelum ini, hanya baris yang diserlahkan tanpa memperincikan bahagian baris mana yang menyebabkan ralat). Maklumat surih lanjutan juga boleh diperoleh melalui API dan digunakan untuk memetakan arahan kod bait individu ke kedudukan tertentu dalam kod sumber menggunakan kaedah codeobject.co_positions() atau fungsi C API PyCode_Addr2Location(). Perubahan ini menjadikannya lebih mudah untuk menyahpepijat masalah dengan objek kamus bersarang, panggilan berbilang fungsi dan ungkapan aritmetik yang kompleks. Traceback (panggilan terbaharu terakhir): Fail "calculation.py", baris 54, dalam hasil = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: bahagi dengan sifar
  • Menambah sokongan untuk kumpulan pengecualian, memberikan program keupayaan untuk menjana dan memproses beberapa pengecualian berbeza sekaligus. Untuk mengumpulkan berbilang pengecualian dan menaikkannya bersama-sama, jenis pengecualian baharu ExceptionGroup dan BaseExceptionGroup telah dicadangkan dan ungkapan "kecuali*" telah ditambahkan untuk menyerlahkan pengecualian individu daripada kumpulan.
  • Kaedah add_note() telah ditambahkan pada kelas BaseException, membolehkan anda melampirkan nota teks pada pengecualian, contohnya, menambah maklumat kontekstual yang tidak tersedia apabila pengecualian dilemparkan.
  • Menambahkan jenis Diri khas untuk mewakili kelas persendirian semasa. Diri boleh digunakan untuk menganotasi kaedah yang mengembalikan contoh kelasnya dengan cara yang lebih mudah daripada menggunakan TypeVar. kelas MyLock: def __enter__(self) -> Self: self.lock() return self
  • Menambahkan jenis LiteralString khas yang hanya boleh memasukkan literal rentetan yang serasi dengan jenis LiteralString (iaitu, rentetan kosong dan LiteralString, tetapi bukan rentetan str sewenang-wenangnya atau gabungan). Jenis LiteralString boleh digunakan untuk mengehadkan penghantaran argumen rentetan kepada fungsi, penggantian sewenang-wenangnya bahagian rentetan yang boleh membawa kepada kelemahan, contohnya, apabila menjana rentetan untuk pertanyaan SQL atau arahan shell. def run_query(sql: LiteralString) -> ... ... def pemanggil( arbitrary_string: str, query_string: LiteralString, table_name: LiteralString, ) -> Tiada: run_query("SELECT * FROM students") # ok run_query(literal_string) # ok run_query( "SELECT * FROM" + literal_string) # ok run_query(arbitrary_string) # Ralat run_query( # Ralat f"PILIH * DARI pelajar WHERE nama = {arbitrary_string}" )
  • Jenis TypeVarTuple telah ditambah, membenarkan penggunaan generik berubah-ubah, tidak seperti TypeVar, yang tidak meliputi satu jenis, tetapi bilangan jenis yang sewenang-wenangnya.
  • Pustaka standard termasuk modul tomllib dengan fungsi untuk menghuraikan format TOML.
  • Adalah mungkin untuk menandakan elemen individu kamus yang ditaip (TypedDict) dengan label Diperlukan dan Tidak Diperlukan untuk menentukan medan yang diperlukan dan pilihan (secara lalai, semua medan yang diisytiharkan diperlukan jika jumlah parameter tidak ditetapkan kepada False). class Movie(TypedDict): tajuk: str year: NotRequired[int] m1: Movie = {"title": "Black Panther", "year": 2018} # OK m2: Movie = {"title": "Star Wars" } # OK (medan tahun adalah pilihan) m3: Movie = {β€œyear”: 2022} # Ralat, medan tajuk yang diperlukan tidak diisi)
  • Kelas TaskGroup telah ditambahkan pada modul asyncio dengan pelaksanaan pengurus konteks tak segerak yang menunggu sekumpulan tugasan selesai. Menambah tugas pada kumpulan dilakukan menggunakan kaedah create_task(). async def main(): async dengan asyncio.TaskGroup() sebagai tg: task1 = tg.create_task(some_coro(...)) task2 = tg.create_task(another_coro(...)) print("Kedua-dua tugas telah selesai sekarang .")
  • Penambahan @dataclass_transform penghias untuk kelas, kaedah dan fungsi, apabila dinyatakan, sistem semakan jenis statik memperlakukan objek seolah-olah menggunakan penghias @dataclasses.dataclass. Dalam contoh di bawah, kelas CustomerModel, apabila menyemak jenis, akan diproses sama seperti kelas dengan penghias @dataclasses.dataclass, i.e. sebagai mempunyai kaedah __init__ yang menerima pembolehubah id dan nama. @dataclass_transform() class ModelBase: ... class CustomerModel(ModelBase): id: int name: str
  • Dalam ungkapan biasa, keupayaan untuk menggunakan pengelompokan atom ((?>...)) dan pengkuantiti milik (*+, ++, ?+, {m,n}+) telah ditambah.
  • Menambahkan pilihan baris arahan "-P" dan pembolehubah persekitaran PYTHONSAFEPATH untuk melumpuhkan lampiran automatik laluan fail yang berpotensi tidak selamat ke sys.path.
  • Utiliti py.exe untuk platform Windows telah dipertingkatkan dengan ketara, menambah sokongan untuk sintaks "-V:". / " sebagai tambahan kepada "- . "
  • Banyak makro dalam C API ditukar kepada fungsi sebaris biasa atau statik.
  • Modul uu, cgi, paip, crypt, aifc, chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb, mailcap, ossaudiodev dan sunau telah ditamatkan dan akan dialih keluar dalam Python 3.13 keluaran. Mengalih keluar fungsi PyUnicode_Encode*.

Sumber: opennet.ru

Tambah komen