Keluaran bahasa pengaturcaraan Python 3.9

Selepas setahun pembangunan dibentangkan keluaran bahasa pengaturcaraan yang ketara Python 3.9. Python 3.9 adalah keluaran pertama selepas itu peralihan projek pada kitaran baru penyediaan dan sokongan keluaran. Keluaran utama baharu kini akan dijana sekali setahun, dan kemas kini pembetulan akan dikeluarkan setiap dua bulan. Setiap cawangan penting akan disokong selama satu setengah tahun, selepas itu tiga setengah tahun lagi akan dibangunkan untuk membetulkan kelemahan.

Kerja di cawangan baharu kini bermula lima bulan sebelum pelepasan cawangan seterusnya, i.e. bertepatan dengan keluaran Python 3.9 bermula ujian alfa cawangan Python 3.10. Cawangan Python 3.10 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. Dua bulan terakhir sebelum pelepasan, cawangan akan berada di peringkat calon pelepasan, di mana penstabilan akhir akan dilakukan.

Antara tambah inovasi dalam Python 3.9:

  • Dalam kamus yang ditakrifkan menggunakan kelas dict terbina dalam, muncul sokongan untuk operator gabungan "|" dan "|=" kemas kini, yang melengkapkan kaedah {**d1, **d2} dan dict.update yang dicadangkan sebelum ini untuk menggabungkan kamus.

    >>> x = {"key1": "value1 from x", "key2": "value2 from x"}
    >>> y = {"key2": "value2 from y", "key3": "value3 from y"}

    >>> x | y
    {'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'}

    >>> y | x
    {'key2': 'value2 from x', 'key3': 'value3 from y', 'key1': 'value1 from x'}

  • Koleksi jenis terbina dalam termasuk senarai, dict dan tupel, yang boleh digunakan sebagai jenis asas tanpa mengimport daripada modul penaipan. Itu. bukannya menaip.Senaraikan, menaip.Dict dan menaip.Tuple kini anda boleh tentukan
    hanya senarai, dict dan tupel:

    def greet_all(nama: senarai[str]) -> Tiada:
    untuk nama dalam nama:
    print("Hello", nama)

  • Disediakan alat fleksibel untuk menganotasi fungsi dan pembolehubah. Untuk melampirkan anotasi, jenis Beranotasi baharu telah ditambahkan pada modul penaipan, memanjangkan jenis sedia ada dengan metadata tambahan yang boleh digunakan untuk analisis statik atau untuk pengoptimuman masa jalan. Untuk mengakses metadata daripada kod, parameter include_extras telah ditambahkan pada kaedah typing.get_type_hints().

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

  • Bertenaga keperluan tatabahasa untuk penghias - sebarang ungkapan yang sesuai untuk digunakan dalam blok if dan while kini boleh digunakan sebagai penghias. Perubahan ini telah meningkatkan kebolehbacaan kod PyQt5 dengan ketara dan memudahkan penyelenggaraan modul ini:

    Adakah:
    button_0 = buttons[0] @button_0.clicked.connect

    Kini anda boleh menulis:
    @buttons[0].diklik.sambung

  • Ke perpustakaan standard tambah modul zoninfo, yang merangkumi maklumat daripada pangkalan data zon waktu IANA.

    >>> dari zoninfo import ZoneInfo
    >>> dari datetime import datetime, timedelta
    >>> # Waktu musim panas
    >>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
    >>> cetak(dt)
    2020-10-31 12:00:00-07:00

    >>> dt.tzname()
    'PDT'

    >>> # Masa standard
    >>> dt += timedelta(hari=7)
    >>> cetak(dt)
    2020-11-07 12:00:00-08:00

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

  • Menambah modul graphlib, di mana dilaksanakan sokongan untuk pengisihan topologi graf.
  • Dicadangkan kaedah baharu untuk mengalih keluar awalan dan penghujung baris - str.removeprefix(prefix) dan str.removesuffix(suffix). Kaedah telah ditambahkan pada str, bait, bytearray dan objek koleksi.UserString.

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

  • Terbabit penghurai baharu PEG (Parsing Expression Grammar), yang menggantikan parser LL(1). Penggunaan parser baharu memungkinkan untuk menyingkirkan beberapa "godam" yang digunakan untuk memintas sekatan dalam LL(1), dan dengan ketara mengurangkan kos buruh untuk mengekalkan parser. Dari segi prestasi, penghurai baharu adalah kira-kira pada tahap yang sama seperti yang sebelumnya, tetapi jauh mendahuluinya dari segi fleksibiliti, yang membolehkan anda berasa lebih bebas apabila mereka bentuk ciri bahasa baharu. Kod parser lama dikekalkan buat masa ini dan boleh dikembalikan menggunakan bendera "-X oldparser" atau pembolehubah persekitaran "PYTHONOLDPARSER=1", tetapi akan dialih keluar dalam keluaran 3.10.
  • Dengan syarat keupayaan untuk kaedah sambungan C untuk mengakses keadaan modul di mana ia ditakrifkan menggunakan dereference penunjuk langsung dan bukannya mencari keadaan modul menggunakan fungsi PyState_FindModule. Perubahan itu membolehkan anda meningkatkan prestasi modul C dengan mengurangkan atau menghapuskan sepenuhnya overhed menyemak keadaan modul. Untuk mengaitkan modul dengan kelas, fungsi C PyType_FromModuleAndSpec() dicadangkan, untuk mendapatkan modul dan keadaannya, fungsi C PyType_GetModule() dan PyType_GetModuleState() dicadangkan, dan untuk menyediakan kaedah dengan akses kepada kelas di mana ia ditakrifkan, PyCMethod fungsi C dan bendera METH_METHOD dicadangkan. .
  • Pengumpul sampah dihantar daripada mengunci koleksi yang mengandungi objek dianimasikan semula yang kekal boleh diakses secara luaran selepas pemuktamad dijalankan.
  • Kaedah ditambah os.pidfd_open, yang membenarkan subsistem kernel Linux "pidfd" digunakan untuk mengendalikan situasi penggunaan semula PID (pidfd dikaitkan dengan proses tertentu dan tidak berubah, manakala PID boleh dikaitkan dengan proses lain selepas proses semasa yang dikaitkan dengan PID itu ditamatkan ).
  • Sokongan untuk spesifikasi Unicode telah dikemas kini kepada versi 13.0.0.
  • Dihapuskan kebocoran memori apabila memulakan semula penterjemah Python dalam proses yang sama.
  • Prestasi julat jenis terbina dalam, tuple, set, frozenset, senarai dan dict telah dioptimumkan. dilaksanakan melalui penggunaan protokol pintasan Vectorcall untuk capaian yang lebih pantas kepada objek yang ditulis dalam bahasa C.
  • Modul _abc, audioop, _bz2, _codec, _contextvars, _crypt, _functools, _json, _locale, operator, sumber, masa dan _weakref dimuatkan daripada permulaan dalam beberapa peringkat.
  • Modul perpustakaan standard audioop, ast, grp, _hashlib, pwd, _posixsubprocess, rawak, pilih, struct, termios dan zlib telah ditukar kepada penggunaan terhad ABI yang stabil, yang menyelesaikan masalah kebolehkendalian pemasangan modul sambungan untuk versi Python yang berbeza (semasa mengemas kini versi, tidak perlu membina semula modul sambungan, dan modul yang disusun untuk 3.9 akan dapat berfungsi dalam cawangan 3.10).
  • Modul asyncio telah menghentikan sokongan untuk parameter reuse_address disebabkan oleh isu keselamatan yang berpotensi (menggunakan SO_REUSEADDR untuk UDP pada Linux membenarkan proses yang berbeza untuk melampirkan soket mendengar pada port UDP).
  • Pengoptimuman baharu telah ditambah, sebagai contoh, peningkatan prestasi pengendali isyarat dalam aplikasi berbilang benang, peningkatan kelajuan modul subproses dalam persekitaran FreeBSD dan penetapan pembolehubah sementara yang lebih pantas (menetapkan pembolehubah dalam ungkapan β€œuntuk y dalam [expr ]” kini berprestasi seperti β€œy = expr” "). Secara umum, kebanyakan ujian tunjukkan penurunan prestasi berbanding cawangan 3.8 (percepatan diperhatikan hanya dalam ujian write_local dan write_deque):

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

    Akses baca pembolehubah dan atribut:
    baca_tempatan 7.1 7.1 5.4 5.1 3.9 4.0
    read_nonlocal 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_built 21.1 21.6 18.5 19.0 7.5 7.7
    read_classvar_from_class 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
    baca_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
    read_boundmethod 37.6 37.9 29.6 26.9 27.7 45.9

    Akses tulis pembolehubah dan atribut:
    tulis_tempatan 8.7 9.3 5.5 5.3 4.3 4.2
    tulis_bukantempatan 10.5 11.1 5.6 5.5 4.7 4.9
    write_global 19.7 21.2 18.0 18.0 15.8 17.2
    write_classvar 92.9 96.0 104.6 102.1 39.2 43.2
    write_instancevar 44.6 45.8 40.0 38.9 35.5 40.7
    write_instancevar_slots 35.6 36.1 27.3 26.6 25.7 27.7

    Akses baca struktur data:
    senarai_baca 24.2 24.5 20.8 20.8 19.0 21.1
    read_deque 24.7 25.5 20.2 20.6 19.8 21.6
    baca_dikt 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:
    senarai_tulis 27.1 28.5 22.5 21.6 20.0 21.6
    write_deque 28.7 30.1 22.7 21.8 23.5 23.2
    tulis_dikt 31.4 33.3 29.3 29.2 24.7 27.8
    write_strdict 28.4 29.9 27.5 25.2 23.1 29.8

    Operasi tindanan (atau baris gilir):
    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

    Gelung masa:
    gelung_atas 0.5 0.6 0.4 0.3 0.3 0.3

  • Dialih keluar banyak fungsi dan kaedah Python 2.7 yang sebelum ini ditamatkan dan mengakibatkan DeprecationWarning dalam keluaran sebelumnya, termasuk kaedah unescape() dalam html.parser.HTMLParser,
    tostring() dan fromstring() dalam array.array, isAlive() dalam threading.Thread, getchildren() dan getiterator() dalam ElementTree, sys.getcheckinterval(), sys.setcheckinterval(), asyncio.Task.current_task(), asyncio.Task.all_tasks(), base64.encodestring() dan base64.decodestring().

Sumber: opennet.ru

Tambah komen