Paglabas ng Python 3.9 programming language

Pagkatapos ng isang taon ng pag-unlad ipinakita makabuluhang pagpapalabas ng programming language Python 3.9. Ang Python 3.9 ay ang unang release pagkatapos paglipat proyekto sa bagong cycle paghahanda at suporta ng mga release. Mabubuo na ngayon ang mga bagong pangunahing release isang beses sa isang taon, at ang mga corrective update ay ilalabas bawat dalawang buwan. Ang bawat makabuluhang sangay ay susuportahan sa loob ng isa at kalahating taon, pagkatapos nito ay bubuo ng isa pang tatlo at kalahating taon para ayusin nito ang mga kahinaan.

Magsisimula na ngayon ang trabaho sa isang bagong sangay limang buwan bago ilabas ang susunod na sangay, i.e. kasabay ng paglabas ng Python 3.9 nagsimula alpha testing ng Python 3.10 branch. Ang sangay ng Python 3.10 ay nasa alpha release sa loob ng pitong buwan, kung saan ang mga bagong feature ay idaragdag at ang mga bug ay maaayos. Pagkatapos nito, susuriin ang mga bersyon ng beta sa loob ng tatlong buwan, kung saan ang pagdaragdag ng mga bagong feature ay ipagbabawal at lahat ng atensyon ay babayaran sa pag-aayos ng mga bug. Ang huling dalawang buwan bago ang paglabas, ang sangay ay nasa yugto ng kandidato sa pagpapalabas, kung saan isasagawa ang panghuling pagpapapanatag.

sa idinagdag mga inobasyon sa Python 3.9:

  • Sa mga diksyunaryo na tinukoy gamit ang built-in na dict class, lumitaw suporta para sa mga merge operator na "|" at "|=" na mga update, na umakma sa mga pamamaraan ng {**d1, **d2} at dict.update na dati nang iminungkahi para sa pagsasama-sama ng mga diksyunaryo.

    >>> x = {"key1": "value1 mula sa x", "key2": "value2 mula sa 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'}

  • Kasama sa built-in na koleksyon ng mga uri ang listahan, dict, at tuple, na maaaring gamitin bilang mga base na uri nang hindi nag-i-import mula sa module ng pagta-type. Yung. sa halip na mag-type.Maglista, mag-type.Dict at mag-type.Tuple maaari mo na ngayong tukuyin
    list, dict and tuple lang:

    def greet_all(mga pangalan: list[str]) -> Wala:
    para sa pangalan sa mga pangalan:
    print("Hello", pangalan)

  • Ay ibinigay mga flexible na tool para sa pag-annotate ng mga function at variable. Para sa pag-attach ng mga anotasyon, isang bagong uri ng Annotated ang idinagdag sa module ng pagta-type, na nagpapalawak ng mga umiiral nang uri na may karagdagang metadata na maaaring magamit para sa static na pagsusuri o para sa mga pag-optimize ng run-time. Upang ma-access ang metadata mula sa code, ang include_extras na parameter ay idinagdag sa typing.get_type_hints() na paraan.

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

  • Mababang tono mga kinakailangan sa gramatika para sa mga dekorador - anumang expression na angkop para sa paggamit sa kung at habang ang mga bloke ay maaari na ngayong gamitin bilang isang dekorador. Ang pagbabago ay makabuluhang nagpabuti sa pagiging madaling mabasa ng PyQt5 code at pinasimple ang pagpapanatili ng module na ito:

    Ito ay:
    button_0 = buttons[0] @button_0.clicked.connect

    Ngayon ay maaari kang sumulat:
    @buttons[0].clicked.connect

  • Sa karaniwang aklatan dagdag pa module zoneinfo, na kinabibilangan ng impormasyon mula sa database ng time zone ng IANA.

    >>> mula sa zoneinfo import ZoneInfo
    >>> mula datetime import datetime, timedelta
    >>> # Tag-init
    >>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
    >>> print(dt)
    2020-10-31 12:00:00-07:00

    >>> dt.tzname()
    'PDT'

    >>> # Karaniwang oras
    >>> dt += timedelta(mga araw=7)
    >>> print(dt)
    2020-11-07 12:00:00-08:00

    >>> print(dt.tzname())
    PST

  • Nagdagdag ng graphlib module, kung saan ipinatupad suporta para sa topological na pag-uuri ng mga graph.
  • Iminungkahi mga bagong pamamaraan para sa pag-alis ng mga prefix at mga dulo ng linya - str.removeprefix(prefix) at str.removesuffix(suffix). Naidagdag ang mga pamamaraan sa str, bytes, bytearray at collections.UserString objects.

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

  • Kasangkot bagong parser Magtalasok (Parsing Expression Grammar), na pumalit sa parser LL(1). Ang paggamit ng bagong parser ay naging posible upang maalis ang ilan sa mga "hack" na ginamit upang laktawan ang mga paghihigpit sa LL(1), at makabuluhang nabawasan ang mga gastos sa paggawa para sa pagpapanatili ng parser. Sa mga tuntunin ng pagganap, ang bagong parser ay humigit-kumulang sa parehong antas tulad ng nauna, ngunit higit na nauuna dito sa mga tuntunin ng kakayahang umangkop, na nagbibigay-daan sa iyong pakiramdam na mas malaya kapag nagdidisenyo ng mga bagong feature ng wika. Ang lumang parser code ay pinananatili sa ngayon at maaaring ibalik gamit ang "-X oldparser" na flag o ang "PYTHONOLDPARSER=1" na environment variable, ngunit aalisin sa release 3.10.
  • Ibinigay ang kakayahan para sa mga pamamaraan ng extension ng C na ma-access ang estado ng mga module kung saan ang mga ito ay tinukoy gamit ang direktang pointer dereference sa halip na maghanap para sa estado ng module gamit ang PyState_FindModule function. Ang pagbabago ay nagbibigay-daan sa iyo upang mapataas ang pagganap ng mga C module sa pamamagitan ng pagbabawas o ganap na pag-aalis ng overhead ng pagsuri sa estado ng module. Upang iugnay ang isang module sa isang klase, ang C-function na PyType_FromModuleAndSpec() ay iminungkahi, upang makuha ang module at ang estado nito, ang C-function na PyType_GetModule() at PyType_GetModuleState() ay iminungkahi, at upang magbigay ng isang paraan na may access sa klase kung saan ito ay tinukoy, ang C-function na PyCMethod at ang METH_METHOD na watawat ay iminungkahi. .
  • Basurero naihatid mula sa pag-lock ng mga koleksyon na naglalaman ng mga reanimated na bagay na nananatiling naa-access sa labas pagkatapos tumakbo ang finalizer.
  • Idinagdag na paraan os.pidfd_open, na nagpapahintulot sa Linux kernel subsystem na "pidfd" na magamit upang pangasiwaan ang sitwasyon ng muling paggamit ng PID (ang pidfd ay nauugnay sa isang partikular na proseso at hindi nagbabago, habang ang isang PID ay maaaring iugnay sa isa pang proseso pagkatapos ng kasalukuyang proseso na nauugnay sa PID na iyon ).
  • Ang suporta para sa detalye ng Unicode ay na-update sa bersyon 13.0.0.
  • Tinanggal pagtagas ng memorya kapag muling sinisimulan ang Python interpreter sa parehong proseso.
  • Ang pagganap ng mga built-in na hanay ng mga uri, tuple, set, frozenset, listahan at dict ay na-optimize. ipinatupad sa pamamagitan ng paggamit ng Vectorcall shortcut protocol para sa mas mabilis na pag-access sa mga bagay na nakasulat sa wikang C.
  • Ang mga module _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, oras at _weakref ay na-load mula sa pagsisimula sa ilang yugto.
  • Ang karaniwang mga module ng library na audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios at zlib ay na-convert upang gumamit ng restricted matatag na ABI, na lumulutas sa problema ng operability ng mga assemblies ng extension modules para sa iba't ibang bersyon ng Python (kapag ina-update ang bersyon, hindi na kailangang muling itayo ang mga extension module, at ang mga module na pinagsama-sama para sa 3.9 ay magagawang gumana sa 3.10 branch).
  • Ang asyncio module ay hindi na ginagamit ang suporta para sa reuse_address na parameter dahil sa mga potensyal na isyu sa seguridad (gamit ang SO_REUSEADDR para sa UDP sa Linux ay nagbibigay-daan sa iba't ibang proseso na mag-attach ng mga listening socket sa isang UDP port).
  • Ang mga bagong pag-optimize ay naidagdag, halimbawa, pinahusay na pagganap ng mga tagapangasiwa ng signal sa mga multi-threaded na application, pinataas na bilis ng subprocess na module sa kapaligiran ng FreeBSD, at mas mabilis na pagtatalaga ng mga pansamantalang variable (nagtatalaga ng variable sa expression na "para sa y sa [expr ]” ay gumaganap na ngayon bilang ang expression na β€œy = expr” "). Sa pangkalahatan, karamihan sa mga pagsubok ipakita pagbaba ng pagganap kumpara sa branch 3.8 (ang speedup ay sinusunod lamang sa write_local at write_deque na mga pagsubok):

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

    Variable at attribute read access:
    read_local 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
    read_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
    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
    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
    read_bound method 37.6 37.9 29.6 26.9 27.7 45.9

    Access sa pagsulat ng variable at attribute:
    write_local 8.7 9.3 5.5 5.3 4.3 4.2
    write_nonlocal 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

    Istruktura ng data read access:
    read_list 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
    read_dict 24.3 25.7 22.3 23.0 21.0 22.5
    read_strdict 22.6 24.3 19.5 21.2 18.9 21.6

    Access sa pagsulat ng istraktura ng data:
    write_list 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
    write_dict 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

    Mga pagpapatakbo ng stack (o queue):
    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

    Timing loop:
    loop_overhead 0.5 0.6 0.4 0.3 0.3 0.3

  • Tinanggal maraming mga function at pamamaraan ng Python 2.7 na dati nang hindi na ginagamit at nagresulta sa isang DeprecationWarning sa nakaraang release, kasama ang unescape() method sa html.parser.HTMLParser,
    tostring() at fromstring() sa array.array, isAlive() sa threading.Thread, getchildren() at getiterator() sa ElementTree, sys.getcheckinterval(), sys.setcheckinterval(), asyncio.Task.current_task(), asyncio.Task.all_tasks(), base64.encodestring() at base64.decodestring().

Pinagmulan: opennet.ru

Magdagdag ng komento