Rilis bahasa pemrograman Python 3.9

Setelah satu tahun pembangunan disajikan rilis bahasa pemrograman yang signifikan Python 3.9. Python 3.9 adalah rilis pertama setelahnya transisi proyek aktif siklus baru persiapan dan dukungan rilis. Rilis besar baru kini akan dihasilkan setahun sekali, dan pembaruan korektif akan dirilis setiap dua bulan. Setiap cabang penting akan didukung selama satu setengah tahun, setelah itu tiga setengah tahun lagi akan dikembangkan untuk memperbaiki kerentanan.

Pengerjaan cabang baru sekarang dimulai lima bulan sebelum peluncuran cabang berikutnya, yaitu. bertepatan dengan rilis Python 3.9 dimulai pengujian alfa dari cabang Python 3.10. Cabang Python 3.10 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. Dua bulan terakhir sebelum rilis, cabang akan berada pada tahap kandidat rilis, di mana stabilisasi akhir akan dilakukan.

antara ditambahkan inovasi dengan Python 3.9:

  • Dalam kamus yang ditentukan menggunakan kelas dict bawaan, muncul dukungan untuk operator penggabungan "|" dan pembaruan "|=", yang melengkapi metode {**d1, **d2} dan dict.update yang sebelumnya diusulkan untuk menggabungkan kamus.

    >>> x = {"key1": "nilai1 dari x", "key2": "nilai2 dari x"}
    >>> y = {"key2": "nilai2 dari y", "key3": "nilai3 dari y"}

    >>> x | kamu
    {'key1': 'nilai1 dari x', 'key2': 'nilai2 dari y', 'key3': 'nilai3 dari y'}

    >>> kamu | X
    {'key2': 'nilai2 dari x', 'key3': 'nilai3 dari y', 'key1': 'nilai1 dari x'}

  • Koleksi tipe bawaan mencakup list, dict, dan tuple, yang dapat digunakan sebagai tipe dasar tanpa mengimpor dari modul pengetikan. Itu. alih-alih mengetik.List, mengetik.Dict, dan mengetik.Tuple, kini Anda dapat menentukannya
    cukup daftar, dikt, dan Tuple:

    defgreet_all(nama: daftar[str]) -> Tidak ada:
    untuk nama dalam nama:
    print("Halo", nama)

  • Disediakan alat fleksibel untuk membuat anotasi fungsi dan variabel. Untuk melampirkan anotasi, tipe Anotasi baru telah ditambahkan ke modul pengetikan, memperluas tipe yang ada dengan metadata tambahan yang dapat digunakan untuk analisis statis atau untuk optimasi run-time. Untuk mengakses metadata dari kode, parameter include_extras telah ditambahkan ke metode mengetik.get_type_hints().

    charType = Beranotasi[int, ctype("char")] UnsignedShort = Beranotasi[int, struct2.ctype('H')]

  • Diperkecil persyaratan tata bahasa untuk dekorator - ekspresi apa pun yang cocok untuk digunakan dalam blok if dan while sekarang dapat digunakan sebagai dekorator. Perubahan ini secara signifikan meningkatkan keterbacaan kode PyQt5 dan menyederhanakan pemeliharaan modul ini:

    Dulu:
    button_0 = tombol[0] @button_0.clicked.connect

    Sekarang Anda dapat menulis:
    @buttons[0].clicked.connect

  • Ke perpustakaan standar ditambahkan modul info zona, yang mencakup informasi dari database zona waktu IANA.

    >>> dari zoneinfo impor ZoneInfo
    >>> dari datetime impor datetime, timedelta
    >>> # Waktu musim panas
    >>> dt = tanggalwaktu(2020, 10, 31, 12, tzinfo=ZoneInfo("Amerika/Los_Angeles"))
    >>> mencetak(dt)
    2020-10-31 12:00:00-07:00

    >>> dt.tzname()
    'PDT'

    >>> # Waktu standar
    >>> dt += timedelta(hari=7)
    >>> mencetak(dt)
    2020-11-07 12:00:00-08:00

    >>> cetak(dt.tzname())
    PST

  • Menambahkan modul graphlib, di mana diimplementasikan dukungan untuk penyortiran grafik topologi.
  • Diajukan metode baru untuk menghapus awalan dan akhiran baris - str.removeprefix(awalan) dan str.removesuffix(akhiran). Metode telah ditambahkan ke objek str, bytes, bytearray dan collections.UserString.

    >>> s = "FooBar"
    >>> s.removeprefix("Foo")
    'Batang'

  • Terlibat pengurai baru PEG (Parsing Expression Grammar), yang menggantikan parser akan(1). Penggunaan parser baru memungkinkan untuk menghilangkan beberapa β€œperetasan” yang digunakan untuk melewati batasan di LL(1), dan secara signifikan mengurangi biaya tenaga kerja untuk memelihara parser. Dalam hal kinerja, parser baru ini kira-kira berada pada level yang sama dengan parser sebelumnya, tetapi jauh lebih unggul dalam hal fleksibilitas, sehingga Anda merasa lebih bebas saat merancang fitur bahasa baru. Kode parser lama dipertahankan untuk saat ini dan dapat dikembalikan menggunakan tanda "-X oldparser" atau variabel lingkungan "PYTHONOLDPARSER=1", tetapi akan dihapus pada rilis 3.10.
  • Asalkan kemampuan metode ekstensi C untuk mengakses status modul di mana mereka didefinisikan menggunakan dereferensi penunjuk langsung alih-alih mencari status modul menggunakan fungsi PyState_FindModule. Perubahan ini memungkinkan Anda untuk meningkatkan kinerja modul C dengan mengurangi atau sepenuhnya menghilangkan biaya overhead untuk memeriksa status modul. Untuk mengaitkan modul dengan kelas, fungsi C PyType_FromModuleAndSpec() diusulkan, untuk mendapatkan modul dan statusnya, fungsi C PyType_GetModule() dan PyType_GetModuleState() diusulkan, dan untuk menyediakan metode dengan akses ke kelas di mana ia didefinisikan, fungsi C PyCMethod dan flag METH_METHOD diusulkan. .
  • Pemulung terkirim dari mengunci koleksi yang berisi objek yang dihidupkan kembali yang tetap dapat diakses secara eksternal setelah finalizer dijalankan.
  • Metode tambahan os.pidfd_open, yang memungkinkan subsistem kernel Linux "pidfd" digunakan untuk menangani situasi penggunaan kembali PID (pidfd dikaitkan dengan proses tertentu dan tidak berubah, sedangkan PID dapat dikaitkan dengan proses lain setelah proses saat ini yang terkait dengan PID tersebut berakhir ).
  • Dukungan untuk spesifikasi Unicode telah diperbarui ke versi 13.0.0.
  • Dieliminasi kebocoran memori saat menginisialisasi ulang penerjemah Python dalam proses yang sama.
  • Kinerja tipe bawaan range, tuple, set, frozenset, list dan dict telah dioptimalkan. dilaksanakan melalui penggunaan protokol pintasan Vectorcall untuk akses lebih cepat ke objek yang ditulis dalam bahasa C.
  • Modul _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, sumber daya, waktu dan _weakref dimuat dari inisialisasi dalam beberapa tahap.
  • Modul perpustakaan standar audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios dan zlib telah dikonversi untuk menggunakan pembatasan ABI yang stabil, yang memecahkan masalah pengoperasian rakitan modul ekstensi untuk versi Python yang berbeda (saat memperbarui versi, tidak perlu membangun kembali modul ekstensi, dan modul yang dikompilasi untuk 3.9 akan dapat bekerja di cabang 3.10).
  • Modul asyncio tidak lagi mendukung parameter reuse_address karena potensi masalah keamanan (menggunakan SO_REUSEADDR untuk UDP di Linux memungkinkan berbagai proses untuk memasang soket pendengaran ke port UDP).
  • Optimalisasi baru telah ditambahkan, misalnya, peningkatan kinerja penangan sinyal dalam aplikasi multi-thread, peningkatan kecepatan modul subproses di lingkungan FreeBSD, dan penugasan variabel sementara yang lebih cepat (menetapkan variabel dalam ekspresi β€œuntuk y di [expr ]” sekarang memiliki performa yang sama dengan ekspresi β€œy = expr” "). Secara umum, sebagian besar tes tunjukkan penurunan kinerja dibandingkan dengan cabang 3.8 (percepatan hanya diamati pada pengujian write_local dan write_deque):

    Python versi 3.4 3.5 3.6 3.7 3.8 3.9
    β€”β€”β€”β€”β€” β€” β€” β€” β€” β€” β€”

    Akses baca variabel dan atribut:
    baca_lokal 7.1 7.1 5.4 5.1 3.9 4.0
    baca_nonlokal 7.1 8.1 5.8 5.4 4.4 4.8
    baca_global 15.5 19.0 14.3 13.6 7.6 7.7
    read_builtin 21.1 21.6 18.5 19.0 7.5 7.7
    baca_kelasvar_dari_kelas 25.6 26.5 20.7 19.5 18.4 18.6
    read_classvar_from_instance 22.8 23.5 18.8 17.1 16.4 20.1
    read_instancevar 32.4 33.1 28.0 26.3 25.4 27.7
    read_instancevar_slots 27.8 31.3 20.8 20.8 20.2 24.5
    read_namedtuple 73.8 57.5 ​​45.0 46.8 18.4 23.2
    metode_baca 37.6 37.9 29.6 26.9 27.7 45.9

    Akses tulis variabel dan atribut:
    tulis_lokal 8.7 9.3 5.5 5.3 4.3 4.2
    tulis_nonlokal 10.5 11.1 5.6 5.5 4.7 4.9
    tulis_global 19.7 21.2 18.0 18.0 15.8 17.2
    tulis_kelasvar 92.9 96.0 104.6 102.1 39.2 43.2
    tulis_instancevar 44.6 45.8 40.0 38.9 35.5 40.7
    tulis_instancevar_slots 35.6 36.1 27.3 26.6 25.7 27.7

    Akses baca struktur data:
    baca_daftar 24.2 24.5 20.8 20.8 19.0 21.1
    baca_deque 24.7 25.5 20.2 20.6 19.8 21.6
    read_dict 24.3 25.7 22.3 23.0 21.0 22.5
    baca_strdict 22.6 24.3 19.5 21.2 18.9 21.6

    Akses tulis struktur data:
    tulis_daftar 27.1 28.5 22.5 21.6 20.0 21.6
    tulis_deque 28.7 30.1 22.7 21.8 23.5 23.2
    tulis_diktekan 31.4 33.3 29.3 29.2 24.7 27.8
    tulis_strdict 28.4 29.9 27.5 25.2 23.1 29.8

    Operasi tumpukan (atau antrian):
    list_append_pop 93.4 112.7 75.4 74.2 50.8 53.9
    deque_append_pop 43.5 57.0 49.4 49.2 42.5 45.5
    deque_append_popleft 43.7 57.3 49.7 49.7 42.8 45.5

    Putaran waktu:
    loop_overhead 0.5 0.6 0.4 0.3 0.3 0.3

  • Dihapus banyak fungsi dan metode Python 2.7 yang sebelumnya tidak digunakan lagi dan mengakibatkan DeprecationWarning di rilis sebelumnya, termasuk metode unescape() di html.parser.HTMLParser,
    tostring() dan fromstring() di array.array, isAlive() di threading.Thread, getchildren() dan getiterator() di ElementTree, sys.getcheckinterval(), sys.setcheckinterval(), asyncio.Task.current_task(), asyncio.Task.all_tasks(), base64.encodestring() dan base64.decodestring().

Sumber: opennet.ru

Tambah komentar