Nakon godine razvoja značajno izdanje programskog jezika . Python 3.9 je postao prvo izdanje nakon projekta na pripreme i podrške izdanjima. Nova značajna izdanja sada će se pojavljujati svake godine, a ispravci će biti objavljeni svaka dva mjeseca. Svaka značajna grana će se podržavati tokom godinu i pol, nakon čega će se još tri i pol godine objavljivati ispravke za uklanjanje ranjivosti.
Rad na novoj grani sada počinje pet mjeseci prije izdanja sljedeće grane, tj. istovremeno s izdavanjem Python 3.9 alfa-testiranje grane Python 3.10. Grana Python 3.10 će biti u fazi alfa-izdanja tokom sedam mjeseci, za vrijeme kojih će se dodavati nove mogućnosti i ispravljati greške. Nakon toga, tokom tri mjeseca, vršit će se beta-testiranje, tokom kojeg će biti zabranjeno dodavanje novih mogućnosti i cijela pažnja će se usmjeriti na ispravljanje grešaka. Posljednja dva mjeseca prije izdanja grana će biti u fazi kandidata za izdanja, na kojoj će se vršiti konačna stabilizacija.
u Python 3.9:
- U rječnicima, definiranim pomoću ugrađenog razreda dict, podrška za operatore spajanja „|“ i ažuriranja „|=“, koji dopunjuju metode {**d1, **d2} i dict.update, ranije predložene za spajanje rječ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đenu kolekciju tipova uključeni su list, dict i tuple, koje je moguće koristiti kao osnovne tipove bez uvoza iz modula typing. Tj. umjesto typing.List, typing.Dict i typing.Tuple sada se može koristiti
jednostavno list, dict i tuple:def greet_all(names: list[str]) -> None:
for name in names:
print("Hello", name) - fleksibilne mogućnosti za anotaciju funkcija i varijabli. Za dodavanje anotacija u modul typing dodan je novi tip Annotated, koji proširuje postojeće tipove dodatnim metapodacima koji se mogu koristiti tokom statičke analize ili za optimizacije tokom izvođenja. Za pristup metapodacima iz koda, u metodu typing.get_type_hints() dodat je parametar include_extras.
charType = Annotated[int, ctype(«char»)]
UnsignedShort = Annotated[int, struct2.ctype(‘H’)] - gramatički zahtjevi za dekoračore — izraz prikladan za korištenje u if i while blokovima sada se može koristiti kao dekoračor. Ova promjena značajno je poboljšala čitljivost PyQt5 koda i olakšala održavanje ovog modula:
Bilo je:
button_0 = buttons[0]
@button_0.clicked.connectSada se može pisati:
@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
>>> # Ljetno vrijeme
>>> 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 vrijeme
>>> dt += timedelta(days=7)
>>> print(dt)
2020-11-07 12:00:00-08:00>>> print(dt.tzname())
PST - Dodan je graphlib modul, koji podržava topološko sortiranje grafova.
- nove metode za uklanjanje prefiksa i sufiksa stringova — str.removeprefix(prefix) i str.removesuffix(suffix). Metode su dodane objektima str, bytes, bytearray i collections.UserString.
>>> s = «FooBar»
>>> s.removeprefix(«Foo»)
‘Bar’ - novi parser (Grammar za izraze parsiranja), koji je zamijenio parser . Upotreba novog parsera omogućila je uklanjanje određenih „hackova” korištenih za zaobilaženje ograničenja u LL(1), i znatno smanjila troškove održavanja parsera. U pogledu performansi, novi parser je otprilike na istoj razini kao prošli, ali ga znatno nadmašuje u fleksibilnosti, što omogućuje slobodnije razmišljanje pri dizajnu novih funkcionalnosti jezika. Kod starog parsera još uvijek je sačuvan i može se vratiti pomoću zastavice „-X oldparser” ili varijable okruženja „PYTHONOLDPARSER=1”, ali će biti uklonjen u izdanju 3.10.
- mogućnost pristupa metodama C ekstenzija stanju modula u kojima su definirane, koristeći direktno dereferenciranje pokazivača umjesto pretraživanja stanja modula pomoću funkcije PyState_FindModule. Ova promjena poboljšava performanse modula na C-u smanjenjem ili potpunim isključivanjem troškova provjere stanja modula. Za povezivanje modula s klasom predložena je C funkcija PyType_FromModuleAndSpec(), za dobivanje modula i njegovog stanja C funkcije PyType_GetModule() i PyType_GetModuleState(), a za pružanje metodi pristupa klasi u kojoj je definirana, C funkcija PyCMethod i zastavica METH_METHOD.
- Sakupljač smeća od blokiranja kolekcija koje uključuju reanimirane objekte koji ostaju dostupni izvana nakon pokretanja finalizatora.
- Dodana metoda , što omogućuje korištenje Linux jezgrene podsustave "pidfd" za obradu situacija s ponovnim korištenjem PID-a (pidfd je povezan s određenim procesom i ne mijenja se, dok se PID može povezati s drugim procesom nakon završetka trenutnog procesa povezanog s tim PID-om).
- Podrška za Unicode specifikaciju ažurirana je na verziju 13.0.0.
- Uklonjena prilikom ponovne inicijalizacije Python interpreteru unutar jednog procesa.
- Optimizirana je izvedba ugrađenih tipova range, tuple, set, frozenset, list i dict, primjenom protokola brzog poziva Vectorcall za brži pristup objektima napisanima u C-u.
- Moduli _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time i _weakref prevedeni su na učitavanje s .
- Moduli standardne biblioteke audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios i zlib prevedeni su za korištenje ograničenog , koji rješava problem funkcionalnosti modula ekstenzija za različite verzije Pythona (prilikom nadogradnje verzije nije potrebno ponovno sastavljati module ekstenzija, a moduli sastavljeni za 3.9 moći će raditi u grani 3.10).
- U modulu asyncio zbog potencijalnih problema s sigurnošću ukinuta je podrška za parametar reuse_address (korištenje SO_REUSEADDR za UDP na Linuxu omogućuje različitim procesima vezivanje slušajućih soketa na UDP port).
- Dodane su nove optimizacije, na primjer, poboljšane su performanse rukovatelja signala u multithreaded aplikacijama, povećana je brzina rada modula subprocess u FreeBSD okruženju i ubrzano je dodjeljivanje privremenih varijabli (dodjela varijable u izrazu "for y in [expr]" sada ne zaostaje u performansama za izrazom "y = expr"). U cjelini, većina testova pokazuje smanjenje performansi u odnosu na granu 3.8 (ubrzanje se opaža samo u testovima write_local i write_deque):
Verzija Pythona 3.4 3.5 3.6 3.7 3.8 3.9
————— — — — — — —Pristup čitanju varijabli i atributima:
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
čitati_classvar_iz_klase 25.6 26.5 20.7 19.5 18.4 18.6
čitati_classvar_iz_instancije 22.8 23.5 18.8 17.1 16.4 20.1
čitati_instancevar 32.4 33.1 28.0 26.3 25.4 27.7
čitati_instancevar_slots 27.8 31.3 20.8 20.8 20.2 24.5
čitati_namedtuple 73.8 57.5 45.0 46.8 18.4 23.2
čitati_boundmethod 37.6 37.9 29.6 26.9 27.7 45.9Pristup pisanju varijablama i atributima:
pisati_local 8.7 9.3 5.5 5.3 4.3 4.2
pisati_nonlocal 10.5 11.1 5.6 5.5 4.7 4.9
pisati_global 19.7 21.2 18.0 18.0 15.8 17.2
pisati_classvar 92.9 96.0 104.6 102.1 39.2 43.2
pisati_instancevar 44.6 45.8 40.0 38.9 35.5 40.7
pisati_instancevar_slots 35.6 36.1 27.3 26.6 25.7 27.7Pristup čitanju struktura podataka:
čitati_listu 24.2 24.5 20.8 20.8 19.0 21.1
čitati_deque 24.7 25.5 20.2 20.6 19.8 21.6
čitati_dict 24.3 25.7 22.3 23.0 21.0 22.5
čitati_strdict 22.6 24.3 19.5 21.2 18.9 21.6Pristup pisanju struktura podataka:
pisati_listu 27.1 28.5 22.5 21.6 20.0 21.6
pisati_deque 28.7 30.1 22.7 21.8 23.5 23.2
pisati_dict 31.4 33.3 29.3 29.2 24.7 27.8
pisati_strdict 28.4 29.9 27.5 25.2 23.1 29.8Operacije sa stogom (ili redom):
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.5Vremensko mjerenje petlji:
petlja_preko 0.5 0.6 0.4 0.3 0.3 0.3 - brojne funkcije i metode Python 2.7 koje su prethodno označene kao zastarjele i u prošlom izdanju izazvale su upozorenje DeprecationWarning, uključujući metodu unescape() u html.parser.HTMLParser,
tostring() i fromstring() u array.array, isAlive() u threading.Thread, getchildren() i getiterator() u ElementTree, sys.getcheckinterval(), sys.setcheckinterval(), asyncio.Task.current_task(), asyncio.Task.all_tasks(), base64.encodestring() i base64.decodestring().
Izvor: opennet.ru
