Rilaxx tal-lingwa ta 'programmar Python 3.9

Wara sena ta 'żvilupp ippreżentata rilaxx sinifikanti tal-lingwa tal-programmazzjoni python 3.9. Python 3.9 kien l-ewwel rilaxx wara transizzjoni proġett fuq ċiklu ġdid preparazzjoni u appoġġ tar-rilaxxi. Rilaxxi ewlenin ġodda issa se jiġu ġġenerati darba fis-sena, u aġġornamenti korrettivi se jiġu rilaxxati kull xahrejn. Kull fergħa sinifikanti se tkun appoġġjata għal sena u nofs, u wara se jiġu żviluppati tliet snin u nofs oħra biex tirranġa l-vulnerabbiltajiet.

Ix-xogħol fuq fergħa ġdida issa jibda ħames xhur qabel ir-rilaxx tal-fergħa li jmiss, i.e. jikkoinċidi mar-rilaxx ta 'Python 3.9 beda ittestjar alfa tal-fergħa Python 3.10. Il-fergħa Python 3.10 se tkun fil-ħruġ alpha għal seba 'xhur, li matulhom se jiżdiedu karatteristiċi ġodda u l-bugs jiġu ffissati. Wara dan, verżjonijiet beta se jiġu ttestjati għal tliet xhur, li matulhom iż-żieda ta 'karatteristiċi ġodda se tkun ipprojbita u se tingħata l-attenzjoni kollha għall-iffissar tal-bugs. L-aħħar xahrejn qabel ir-rilaxx, il-fergħa tkun fl-istadju tal-kandidat għar-rilaxx, li fih issir l-istabbilizzazzjoni finali.

Fost miżjud innovazzjonijiet f'Python 3.9:

  • F'dizzjunarji definiti bl-użu tal-klassi dict inkorporata, deher appoġġ għall-operaturi tal-għaqda "|" u "|=" aġġornamenti, li jikkumplimentaw il-metodi {**d1, **d2} u dict.update proposti qabel biex jingħaqdu dizzjunarji.

    >>> x = {"key1": "valur1 minn x", "key2": "valur2 minn x"}
    >>> y = {"key2": "valur2 minn y", "key3": "valur3 minn y"}

    >>> x | y
    {'key1': 'valur1 minn x', 'key2': 'valur2 minn y', 'key3': 'valur3 minn y'}

    >>> y | x
    {'key2': 'valur2 minn x', 'key3': 'valur3 minn y', 'key1': 'valur1 minn x'}

  • Il-ġbir ta 'tipi integrati jinkludi lista, dict, u tuple, li jistgħu jintużaw bħala tipi bażi mingħajr ma jimportaw mill-modulu tat-tajpjar. Dawk. minflok ittajpjar.List, typing.Dict u typing.Tuple issa tista' tispeċifika
    biss lista, dict u tuple:

    def greet_all(ismijiet: lista[str]) -> Xejn:
    għall-ismijiet fl-ismijiet:
    print("Hello", isem)

  • Huma pprovduti għodod flessibbli għall-annotazzjoni tal-funzjonijiet u l-varjabbli. Għat-twaħħil ta' annotazzjonijiet, ġie miżjud tip Annotat ġdid mal-modulu tat-tajpjar, li jestendi t-tipi eżistenti b'metadejta addizzjonali li tista' tintuża għal analiżi statika jew għal ottimizzazzjonijiet ta' run-time. Biex taċċessa l-metadata mill-kodiċi, il-parametru include_extras ġie miżjud mal-metodu typing.get_type_hints().

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

  • Attenwat rekwiżiti grammatikali għal dekoraturi - kwalunkwe espressjoni adattata għall-użu fl-if u filwaqt li blokki issa jistgħu jintużaw bħala dekoratur. Il-bidla tejbet b'mod sinifikanti l-leġibbiltà tal-kodiċi PyQt5 u ssimplifikat il-manutenzjoni ta 'dan il-modulu:

    Kien:
    button_0 = buttuni[0] @button_0.clicked.connect

    Issa tista’ tikteb:
    @buttons[0].klicked.connect

  • Lil-librerija standard miżjud modulu zoneinfo, li tinkludi informazzjoni mid-database taż-żona tal-ħin tal-IANA.

    >>> minn zoneinfo importazzjoni ZoneInfo
    >>> minn datetime importazzjoni datetime, timedelta
    >>> # Ħin tas-sajf
    >>> dt = datatime(2020, 10, 31, 12, tzinfo=ZoneInfo("Amerika/Los_Angeles"))
    >>> print(dt)
    2020-10-31 12:00:00-07:00

    >>> dt.tzname()
    'PDT'

    >>> # Ħin standard
    >>> dt += timedelta(jiem=7)
    >>> print(dt)
    2020-11-07 12:00:00-08:00

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

  • Modulu graphlib miżjud, li fih implimentati appoġġ għall-għażla topoloġika tal-grafiċi.
  • Propost metodi ġodda għat-tneħħija tal-prefissi u t-truf tal-linja - str.removeprefix(prefix) u str.removesuffix(suffix). Ġew miżjuda metodi għall-oġġetti str, bytes, bytearray u collections.UserString.

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

  • Involut parser ġdid PEG (Parsing Expression Grammar), li ssostitwixxa l-parser LL(1). L-użu tal-parser il-ġdid għamilha possibbli li teħles minn uħud mill-"hacks" użati biex tevita r-restrizzjonijiet f'LL(1), u naqqas b'mod sinifikanti l-ispejjeż tax-xogħol għaż-żamma tal-parser. F'termini ta 'prestazzjoni, l-parser il-ġdid huwa bejn wieħed u ieħor fuq l-istess livell bħal dak ta' qabel, iżda huwa sinifikament quddiemu f'termini ta 'flessibilità, li jippermettilek li tħossok aktar liberu meta tfassal karatteristiċi lingwistiċi ġodda. Il-kodiċi antik tal-parser jinżamm għalissa u jista' jiġi rritornat bl-użu tal-marka "-X oldparser" jew il-varjabbli tal-ambjent "PYTHONOLDPARSER=1", iżda se jitneħħa fir-rilaxx 3.10.
  • Ipprovdut l-abbiltà għall-metodi ta 'estensjoni C li jaċċessaw l-istat tal-moduli li fihom huma definiti bl-użu ta' dereference tal-pointer dirett minflok ma jfittxu l-istat tal-modulu bl-użu tal-funzjoni PyState_FindModule. Il-bidla tippermettilek li żżid il-prestazzjoni tal-moduli C billi tnaqqas jew telimina kompletament l-overhead tal-verifika tal-istat tal-modulu. Biex tassoċja modulu ma 'klassi, il-funzjoni C PyType_FromModuleAndSpec() hija proposta, biex jinkisbu l-modulu u l-istat tiegħu, il-funzjonijiet C PyType_GetModule() u PyType_GetModuleState() huma proposti, u biex jipprovdu metodu b'aċċess għall-klassi li fiha hija definita, il-funzjoni C-PyCMethod u l-bandiera METH_METHOD huma proposti.
  • Kollettur taż-żibel mogħtija minn kollezzjonijiet li jissakkru li fihom oġġetti animati mill-ġdid li jibqgħu aċċessibbli esternament wara li l-finalizzatur jibda.
  • Metodu miżjud os.pidfd_open, li tippermetti li s-subsistema tal-qalba tal-Linux "pidfd" tintuża biex tittratta s-sitwazzjoni tal-użu mill-ġdid tal-PID (pidfd huwa assoċjat ma' proċess speċifiku u ma jinbidilx, filwaqt li PID jista' jiġi assoċjat ma' proċess ieħor wara li jintemm il-proċess attwali assoċjat ma' dak il-PID ).
  • L-appoġġ għall-ispeċifikazzjoni Unicode ġie aġġornat għall-verżjoni 13.0.0.
  • Eliminati tnixxija tal-memorja meta terġa' tibda l-interpretu Python fl-istess proċess.
  • Il-prestazzjoni tal-firxa tat-tipi mibnija, tuple, sett, frozenset, lista u dict ġiet ottimizzata. implimentati permezz tal-użu tal-protokoll ta' shortcut Vectorcall għal aċċess aktar mgħaġġel għal oġġetti miktuba fil-lingwa Ċ.
  • Il-moduli _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time u _weakref huma mgħobbija minn inizjalizzazzjoni f'diversi stadji.
  • Il-moduli standard tal-librerija audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios u zlib ġew konvertiti għall-użu ristrett ABI stabbli, li ssolvi l-problema ta 'l-operabilità ta' assemblaġġi ta 'moduli ta' estensjoni għal verżjonijiet differenti ta 'Python (meta taġġorna l-verżjoni, m'hemmx bżonn li jerġgħu jinbnew moduli ta' estensjoni, u moduli kkompilati għal 3.9 se jkunu jistgħu jaħdmu fil-fergħa 3.10).
  • Il-modulu asyncio waqqaf l-appoġġ għall-parametru reuse_address minħabba kwistjonijiet potenzjali ta’ sigurtà (l-użu ta’ SO_REUSEADDR għal UDP fuq Linux jippermetti proċessi differenti biex iwaħħlu sokits tas-smigħ ma’ port UDP).
  • Ġew miżjuda ottimizzazzjonijiet ġodda, pereżempju, prestazzjoni mtejba tal-handlers tas-sinjali f'applikazzjonijiet b'ħafna kamini, żieda fil-veloċità tal-modulu tas-sottoproċess fl-ambjent FreeBSD, u assenjazzjoni aktar mgħaġġla ta 'varjabbli temporanji (assenjazzjoni ta' varjabbli fl-espressjoni "għal y fi [expr ]” issa hija performanti daqs l-espressjoni “y = expr” “). B'mod ġenerali, ħafna testijiet juru tnaqqis fil-prestazzjoni meta mqabbel mal-fergħa 3.8 (il-veloċità hija osservata biss fit-testijiet write_local u write_deque):

    Verżjoni Python 3.4 3.5 3.6 3.7 3.8 3.9
    ————— — — — — — —

    Aċċess għall-qari tal-varjabbli u tal-attributi:
    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_boundmethod 37.6 37.9 29.6 26.9 27.7 45.9

    Aċċess għall-kitba tal-varjabbli u tal-attributi:
    ikteb_lokali 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
    ikteb_globali 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

    Aċċess għall-qari tal-istruttura tad-dejta:
    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

    Aċċess għall-kitba tal-istruttura tad-dejta:
    ikteb_lista 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

    Operazzjonijiet ta’ munzell (jew kju):
    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

    Loop tal-ħin:
    loop_overhead 0.5 0.6 0.4 0.3 0.3 0.3

  • Imneħħija ħafna funzjonijiet u metodi Python 2.7 li qabel kienu deprecati u rriżultaw f'DeprecationWarning fir-rilaxx preċedenti, inkluż il-metodu unescape() f'html.parser.HTMLParser,
    tostring() u fromstring() f'array.array, isAlive() fil-thread.Thread, getchildren() u getiterator() f'ElementTree, sys.getcheckinterval(), sys.setcheckinterval(), asyncio.Task.current_task(), asyncio.Task.all_tasks(), base64.encodestring() u base64.decodestring().

Sors: opennet.ru

Żid kumment