Rilis bahasa pemrograman Python 3.10

Setelah satu tahun pengembangan, rilis signifikan bahasa pemrograman Python 3.10 disajikan. Cabang baru akan didukung selama satu setengah tahun, setelah itu selama tiga setengah tahun berikutnya, perbaikan akan dilakukan untuk menghilangkan kerentanan.

Pada saat yang sama, pengujian alfa cabang Python 3.11 dimulai (sesuai dengan jadwal pengembangan baru, pengerjaan cabang baru dimulai lima bulan sebelum rilis cabang sebelumnya dan mencapai tahap pengujian alfa pada saat rilis berikutnya. ). Cabang Python 3.11 akan berada dalam rilis alfa selama tujuh bulan, di mana fitur-fitur baru akan ditambahkan dan bug diperbaiki. Setelah ini, versi beta akan diuji selama tiga bulan, di mana penambahan fitur baru akan dilarang dan semua perhatian akan diberikan untuk memperbaiki bug. Selama dua bulan terakhir sebelum rilis, cabang akan berada pada tahap kandidat rilis, di mana stabilisasi akhir akan dilakukan.

Tambahan baru pada Python 3.10 meliputi:

  • Menerapkan operator "cocok" dan "kasus" untuk pencocokan pola, yang meningkatkan keterbacaan kode, menyederhanakan pencocokan objek Python arbitrer, dan meningkatkan keandalan kode melalui pemeriksaan tipe statis tingkat lanjut. Implementasinya mirip dengan operator "match" yang disediakan di Scala, Rust, dan F#, yang membandingkan hasil ekspresi tertentu dengan daftar pola yang tercantum dalam blok berdasarkan operator "case".

    def http_error(status): status kecocokan: case 400: mengembalikan “Permintaan buruk” case 401|403|404: mengembalikan “Tidak diperbolehkan” case 418: mengembalikan “Saya teko” case _: mengembalikan “Sesuatu yang lain”

    Anda dapat membongkar objek, tupel, daftar, dan urutan arbitrer untuk mengikat variabel berdasarkan nilai yang ada. Diperbolehkan untuk menentukan templat bertingkat, menggunakan kondisi “jika” tambahan dalam templat, menggunakan masker (“[x, y, *rest]”), pemetaan kunci/nilai (misalnya, {“bandwidth”: b, “latensi ”: l} untuk mengekstrak nilai "bandwidth" dan "latensi" dari kamus), mengekstrak subtemplat (":=" operator), menggunakan konstanta bernama dalam templat. Di kelas, dimungkinkan untuk menyesuaikan perilaku pencocokan menggunakan metode “__match__()”.

    dari kelas data impor kelas data @kelas datakelas Titik: x: int y: int def di mana(titik): titik kecocokan: kasus Titik(0, 0): print("Asal") titik kasus(0, y): cetak(f" Y={y}") case Titik(x, 0): print(f"X={x}") case Titik(): print("Di tempat lain") case _: print("Bukan titik") cocok titik: case Titik(x, y) jika x == y: print(f"Y=X pada {x}") case Titik(x, y): print(f"Tidak pada diagonal") MERAH, HIJAU, BIRU = 0, 1, 2 warna yang cocok: case RED: print("Saya melihat merah!") case HIJAU: print("Rumput berwarna hijau") case BLUE: print("Saya merasakan warna biru :(")

  • Sekarang dimungkinkan untuk menggunakan tanda kurung dalam pernyataan with untuk membagi definisi kumpulan pengelola konteks menjadi beberapa baris. Hal ini juga diperbolehkan untuk meninggalkan koma setelah manajer konteks terakhir dalam grup: dengan ( CtxManager1() sebagai contoh1, CtxManager2() sebagai contoh2, CtxManager3() sebagai contoh3, ): ...
  • Peningkatan pelaporan lokasi kode kesalahan yang terkait dengan kurung kurawal tidak tertutup dan tanda kutip dalam literal string. Misalnya, ketika ada kurung kurawal tidak tertutup, alih-alih melaporkan kesalahan sintaksis pada konstruksi berikut, penunjuk kini menyorot kurung kurawal pembuka dan menunjukkan bahwa tidak ada blok penutup. File "example.py", baris 1 diharapkan = {9:1, 18:2, 19:2, 27:3, 28:3, 29:3, 36:4, 37:4, ^SyntaxError: '{' tidak pernah ditutup

    Menambahkan pesan kesalahan sintaks khusus tambahan: simbol ":" yang hilang sebelum blok dan dalam kamus, tidak memisahkan tupel dengan tanda kurung, tidak ada koma dalam daftar, menentukan blok "coba" tanpa "kecuali" dan "akhirnya", menggunakan "= " alih-alih "= =" dalam perbandingan, tentukan *-ekspresi dalam f-string. Selain itu, ini memastikan bahwa seluruh ekspresi bermasalah disorot, bukan hanya permulaan, dan informasi yang lebih eksplisit tentang konteks kesalahan yang terkait dengan indentasi yang salah. >>> def foo(): ... jika lel: ... x = 2 File " ", baris 3 x = 2 ^ IndentationError: diharapkan ada blok yang menjorok ke dalam setelah pernyataan 'if' di baris 2

    Jika kesalahan disebabkan oleh kesalahan ketik pada nama atribut dan nama variabel dalam suatu fungsi, rekomendasi dengan nama yang benar akan dikeluarkan. >>>collections.namedtoplo Traceback (panggilan terakhir terakhir): File « ", baris 1, masuk AttributeError: modul 'koleksi' tidak memiliki atribut 'namedtoplo'. Apakah maksud Anda: bernamatuple?

  • Untuk alat debugging dan profiler, peristiwa pelacakan disediakan dengan nomor baris yang tepat dari kode yang dieksekusi.
  • Menambahkan pengaturan sys.flags.warn_default_encoding untuk menampilkan peringatan tentang potensi kesalahan yang terkait dengan TextIOWrapper dan open() memproses file yang dikodekan UTF-8 tanpa secara eksplisit menentukan opsi 'encoding=»utf-8″' (encoding ASCII digunakan secara default) . Rilis baru ini juga menyediakan kemampuan untuk menentukan nilai 'encoding="locale"' untuk mengatur pengkodean berdasarkan lokal saat ini.
  • Operator baru telah ditambahkan ke modul pengetikan, yang menyediakan alat untuk menentukan anotasi tipe, memungkinkan penggunaan sintaksis “X | Y" untuk memilih salah satu tipe (tipe X atau tipe Y). def persegi(angka: int | float) -> int | float: return number ** 2 setara dengan konstruksi yang didukung sebelumnya: def square(number: Union[int, float]) -> Union[int, float]: return number ** 2
  • Operator Concatenate dan variabel ParamSpec telah ditambahkan ke modul pengetikan, yang memungkinkan Anda meneruskan informasi tambahan untuk pemeriksaan tipe statis saat menggunakan Callable. Modul pengetikan juga menambahkan nilai khusus TypeGuard untuk memberi anotasi pada fungsi perlindungan tipe dan TypeAlias ​​​​untuk mendefinisikan alias tipe secara eksplisit. StrCache: TypeAlias ​​​​= 'Cache[str]' # tipe alias
  • Fungsi zip() mengimplementasikan tanda “ketat” opsional, yang, ketika ditentukan, memeriksa apakah argumen yang diulang memiliki panjang yang sama. >>> daftar(zip(('a', 'b', 'c'), (1, 2, 3), strict=True)) [('a', 1), ('b', 2) , ('c', 3)] >>> list(zip(range(3), ['fee', 'fi', 'fo', 'fum'], strict=True)) Traceback (panggilan terakhir terakhir ): … ValueError: zip() argumen 2 lebih panjang dari argumen 1
  • Fungsi bawaan baru aiter() dan anext() diusulkan dengan implementasi analog asinkron ke fungsi iter() dan next().
  • Pekerjaan konstruktor str(), bytes() dan bytearray() saat bekerja dengan objek kecil telah dipercepat sebesar 30-40%.
  • Mengurangi jumlah operasi impor dalam modul runpy. Perintah "python3 -m module_name" sekarang berjalan rata-rata 1.4 kali lebih cepat karena pengurangan modul yang diimpor dari 69 menjadi 51.
  • Instruksi LOAD_ATTR menggunakan mekanisme caching untuk masing-masing opcode, yang memungkinkan untuk mempercepat pekerjaan dengan atribut reguler hingga 36%, dan dengan slot hingga 44%.
  • Saat membangun Python dengan opsi “--enable-optimizations”, mode “-fno-semantic-interposition” sekarang diaktifkan, yang memungkinkan mempercepat penerjemah hingga 30% dibandingkan dengan membangun dengan “--enable-shared " pilihan.
  • Modul hashlib dan ssl telah menambahkan dukungan untuk OpenSSL 3.0.0 dan berhenti mendukung versi OpenSSL yang lebih lama dari 1.1.1.
  • Parser lama telah dihapus, yang di cabang sebelumnya digantikan oleh parser PEG (Parsing Expression Grammar). Modul pemformat telah dihapus. Parameter loop telah dihapus dari API asyncio. Metode yang sebelumnya tidak digunakan lagi telah dihapus. Fungsi Py_UNICODE_str* yang memanipulasi string Py_UNICODE* telah dihapus.
  • Modul distutils sudah tidak digunakan lagi dan dijadwalkan untuk dihapus dengan Python 3.12. Daripada distutils, disarankan untuk menggunakan modul setuptools, package, platform, shutil, subprocess dan sysconfig. Struktur wstr di PyUnicodeObject sudah tidak digunakan lagi dan dijadwalkan untuk dihapus.

Sumber: opennet.ru

Tambah komentar