Po letu razvoja značajna izdanje programskog jezika . Python 3.9 je postao prvo izdanje nakon projekta na pripreme i podrške izdanja. Nova značajna izdanja će sada biti formirana jednom godišnje, dok će ispravke biti objavljivane svakih dva meseca. Svaka značajna grana će biti podržana tokom jedne i po godine, nakon čega će naredne tri i po godine biti formirane ispravke za njeno rešavanje ranjivosti.
Rad na novoj grani sada započinje pet meseci pre objavljivanja sledeće grane, tj. istovremeno sa izdanjem Python 3.9 alpha-testiranje grane Python 3.10. Grana Python 3.10 će biti u fazi alpha-izdanja tokom sedam meseci, tokom kojih će se dodavati nove mogućnosti i ispravljati greške. Nakon toga, tokom tri meseca će se vršiti beta-testiranje, kada će dodavanje novih mogućnosti biti zabranjeno, a sva pažnja će biti usmerena na ispravku grešaka. Poslednja dva meseca pre izdanja grana će biti u stanju kandidata za izdanja, na kojem će se izvršiti konačna stabilizacija.
u Python 3.9:
- U rečnicima definisanim pomoću ugrađenog klase dict, podrška operatorima spajanja „|“ i ažuriranja „|=“, koji dopunjuju metode {**d1, **d2} i dict.update, ranije predložene za spajanje rečnika.
>>> 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’} - U ugrađenim kolekcijama tipova uključeni su list, dict i tuple, koje možete koristiti kao osnovne tipove bez uvoza iz modula typing. Tj. umesto typing.List, typing.Dict i typing.Tuple sada možete navesti
jednostavno list, dict i tuple:def greet_all(names: list[str]) -> None:
for name in names:
print("Hello", name) - fleksibilni alati za anotaciju funkcija i promenljivih. Za pridruživanje anotacija u modul typing dodat je novi tip Annotated, koji proširuje postojeće tipove dodatnim metapodacima, koji se mogu koristiti pri statičkoj analizi ili za optimizacije tokom izvršavanja. Za pristup metapodacima iz koda, metodi typing.get_type_hints() dodat je parametar include_extras.
charType = Annotated[int, ctype("char")]
UnsignedShort = Annotated[int, struct2.ctype('H')] - gramatički zahtevi za dekoratore — bilo koji izraz pogodan za korišćenje u if i while blokovima sada može biti korišćen kao dekorator. Ova promena je značajno poboljšala čitljivost koda PyQt5 i olakšala održavanje ovog modula:
Bilo je:
button_0 = buttons[0]
@button_0.clicked.connectSada može da se piše:
@buttons[0].clicked.connect - U standardnu biblioteku modul , uključujući informacije iz IANA baze vremenskih zona.
>>> from zoneinfo import ZoneInfo
>>> from datetime import datetime, timedelta
>>> # Letnje vreme
>>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo('America/Los_Angeles'))
>>> print(dt)
2020-10-31 12:00:00-07:00>>> dt.tzname()
'PDT'>>> # Standardno vreme
>>> dt += timedelta(days=7)
>>> print(dt)
2020-11-07 12:00:00-08:00>>> print(dt.tzname())
PST - Dodan je modul graphlib, koji podržava topološko sortiranje grafova.
- novi metodi za uklanjanje prefiksa i sufiksa iz stringova — str.removeprefix(prefix) i str.removesuffix(suffix). Metodi su dodati u objekte str, bytes, bytearray i collections.UserString.
>>> s = 'FooBar'
>>> s.removeprefix('Foo')
'Bar' - novi parser (Parsing Expression Grammar), koji je zamenio parser . Primena novog parsera omogućila je uklanjanje nekih 'hackova' korišćenih za zaobilaženje ograničenja u LL(1), i značajno smanjila troškove održavanja parsera. U pogledu performansi novi parser je otprilike na istom nivou kao prethodni, ali ga značajno nadmašuje u fleksibilnosti, što omogućava slobodnije projektovanje novih mogućnosti jezika. Kod starog parsera je još uvek sačuvan i može se vratiti pomoću opcije '-X oldparser' ili promenljive okruženja 'PYTHONOLDPARSER=1', ali će biti uklonjen u verziji 3.10.
- mogućnost pristupa metoda C-ekstenzija stanju modula u kojima su definisani, korišćenjem direktnog dereferenciranja pokazivača umesto traženja stanja modula pomoću funkcije PyState_FindModule. Ova promena omogućava poboljšanje performansi C moduļa smanjenjem ili potpunim isključivanjem troškova na proveri stanja modula. Za povezivanje modula s klasom predložena je C-funkcija PyType_FromModuleAndSpec(), a za dobijanje modula i njegovog stanja C-funkcije PyType_GetModule() i PyType_GetModuleState(), dok C-funkcija PyCMethod i zastavica METH_METHOD omogućavaju pristup metodu klasi u kojoj je definisana.
- Sakupljač smeća od blokiranja zbirk, ki vključujejo reanimirane objekte, ki ostajajo dostopni od zunaj po zagonu finalizatorja.
- Dodana metoda , kar omogoča uporabo podsistema jedra Linux 'pidfd' za obvladovanje situacije z večkratno uporabo PID (pidfd je povezan s specifičnim postopkom in se ne spremeni, medtem ko se PID lahko poveže z drugim postopkom po končanju trenutnega postopka, povezanega s tem PID).
- Podpora specifikaciji Unicode je bila posodobljena na različico 13.0.0.
- Odpravljena pri ponovni inicializaciji interpreterja Python v enem postopku.
- Izvedena je bila optimizacija zmogljivosti vgrajenih tipov range, tuple, set, frozenset, list in dict, s pomočjo protokola hitrega klica Vectorcall za hitrejši dostop do objektov, napisanih v jeziku C.
- Moduli _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time in _weakref so bili prevedeni na nalaganje z .
- Moduli standardne knjižnice audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios in zlib so bili prevedeni na uporabo omejenega , ki rešuje težavo delovanja gradiv modulov razširitev za različne različice Pythona (ob nadgradnji različice ni treba ponovno graditi modulov razširitev, moduli zgrajeni za 3.9 bodo delovali v veji 3.10).
- V modulu asyncio je bila zaradi potencialnih težav z varnostjo prenehana podpora za parameter reuse_address (uporaba SO_REUSEADDR za UDP v Linuxu omogoča različnim procesom, da povežejo poslušalske sokete na UDP-vrsto).
- Dodane so bile nove optimizacije, na primer, povečana zmogljivost obdelovalcev signalov v večnitnih aplikacijah, povečana hitrost delovanja modula subprocess v okolju FreeBSD ter pospešeno dodeljevanje časovnih spremenljivk (dodelitev spremenljivke v izrazu 'for y in [expr]' zdaj ne zaostaja za hitrostjo izraza 'y = expr'). Na splošno večina testov prikazuje zmanjšano zmogljivost v primerjavi z vejo 3.8 (pospešitev je opazna samo pri testih write_local in write_deque):
Različica Pythona 3.4 3.5 3.6 3.7 3.8 3.9
————— — — — — — —Dostop do spremenljivk in atributov:
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.9Dostup k zapisam k peremennym i atributam:
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.7Dostup k zapisi struktur dannykh:
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.6Dostup k zapisi struktur dannykh:
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.8Operatsii s stekom (ili ocheredyu):
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.5Izmerenie cikla:
loop_overhead 0.5 0.6 0.4 0.3 0.3 0.3 - Mnogiye funktsii i metody Python 2.7, kotoryye ranee byli otmechena kak устаревшие i v proshlom vypuske privodili k vyvodu predozvresheniya DeprecationWarning, vklyuchaya metod unescape() v html.parser.HTMLParser,
tostring() i fromstring() v array.array, isAlive() v threading.Thread, getchildren() i getiterator() v ElementTree, sys.getcheckinterval(), sys.setcheckinterval(), asyncio.Task.current_task(), asyncio.Task.all_tasks(), base64.encodestring() i base64.decodestring().
Izvor: opennet.ru
