Nakon godinu dana razvoja predstavio značajno izdanje programskog jezika Python 3.9. Python 3.9 bilo je prvo izdanje nakon tranzicija projekt na novi ciklus priprema i podrška izdanjima. Nova glavna izdanja sada će se generirati jednom godišnje, a ispravna ažuriranja će se objavljivati svaka dva mjeseca. Svaka značajna grana bit će podržana jednu i pol godinu, nakon čega će se razvijati još tri i pol godine kako bi se popravile ranjivosti.
Rad na novoj grani sada počinje pet mjeseci prije puštanja sljedeće grane, tj. poklapa se s izdanjem Pythona 3.9 počeo alfa testiranje grane Python 3.10. Ogranak Python 3.10 bit će u alfa izdanju sedam mjeseci, tijekom kojih će se dodavati nove značajke i ispravljati greške. Nakon toga, beta verzije će se testirati tri mjeseca, tijekom kojih će dodavanje novih značajki biti zabranjeno i sva će se pozornost posvetiti ispravljanju grešaka. Posljednja dva mjeseca prije puštanja grana će biti u fazi kandidata za puštanje, pri čemu će se izvršiti konačna stabilizacija.
U rječnicima definiranim pomoću ugrađene klase dict, pojavio podrška za operatore spajanja "|" i "|=" ažuriranja, koja nadopunjuju metode {**d1, **d2} i dict.update prethodno predložene za spajanje rječnika.
>>> x = {"ključ1": "vrijednost1 od x", "ključ2": "vrijednost2 od x"}
>>> y = {"ključ2": "vrijednost2 iz y", "ključ3": "vrijednost3 iz y"}
>>> x | g
{'key1': 'vrijednost1 od x', 'key2': 'vrijednost2 od y', 'key3': 'vrijednost3 od y'}
>>> y | x
{'key2': 'vrijednost2 od x', 'key3': 'vrijednost3 od y', 'key1': 'vrijednost1 od x'}
Ugrađena zbirka tipova uključuje popis, dikt i tuple, koji se mogu koristiti kao osnovni tipovi bez uvoza iz modula za tipkanje. Oni. umjesto tipkanja.List, tipkanja.Dict i tipkanja.Torka koju sada možete navesti
samo popis, dict i tuple:
def greet_all(imena: lista[str]) -> Ništa:
za ime u imenima:
print("Zdravo", ime)
su osigurani fleksibilni alati za označavanje funkcija i varijabli. Za prilaganje bilješki, novi Annotated tip dodan je modulu za tipkanje, proširujući postojeće tipove s dodatnim metapodacima koji se mogu koristiti za statičku analizu ili za optimizaciju vremena izvođenja. Za pristup metapodacima iz koda, parametar include_extras dodan je metodi typing.get_type_hints().
Ublažena gramatički zahtjevi za dekoratore - bilo koji izraz prikladan za upotrebu u if i while blokovima sada se može koristiti kao dekorater. Promjena je značajno poboljšala čitljivost PyQt5 koda i pojednostavila održavanje ovog modula:
Bilo je:
button_0 = gumbi[0] @button_0.clicked.connect
Sada možete napisati:
@buttons[0].clicked.connect
U standardnu knjižnicu dodano modul zoneinfo, koji uključuje podatke iz IANA baze podataka vremenskih zona.
>>> iz zoneinfo uvesti ZoneInfo
>>> from datetime import datetime, timedelta
>>> # Ljetno vrijeme
>>> dt = datumvrijeme(2020, 10, 31, 12, tzinfo=ZoneInfo("Amerika/Los_Angeles"))
>>> ispis(dt)
2020-10-31 12:00:00-07:00
Dodan graphlib modul, u kojem implementiran podrška za topološko sortiranje grafova.
Zaprosio nove metode za uklanjanje prefiksa i završetaka redaka - str.removeprefix(prefix) i str.removesuffix(suffix). Metode su dodane objektima str, bytes, bytearray i collections.UserString.
>>> s = "FooBar"
>>> s.removeprefix("Foo")
'Bar'
Uključeni novi parser PEG (Parsing Expression Grammar), koji je zamijenio parser LL(1). Korištenje novog parsera omogućilo je uklanjanje nekih "hakova" korištenih za zaobilaženje ograničenja u LL(1) i značajno smanjilo troškove rada za održavanje parsera. Što se tiče performansi, novi parser je otprilike na istoj razini kao i prethodni, ali je znatno ispred njega u smislu fleksibilnosti, što vam omogućuje da se osjećate slobodnije pri dizajniranju novih jezičnih značajki. Stari kod parsera za sada je zadržan i može se vratiti pomoću oznake "-X oldparser" ili varijable okruženja "PYTHONOLDPARSER=1", ali će biti uklonjen u izdanju 3.10.
Pod uvjetom mogućnost da metode C proširenja pristupe stanju modula u kojem su definirani korištenjem izravne dereferencije pokazivača umjesto traženja stanja modula pomoću funkcije PyState_FindModule. Promjena vam omogućuje da povećate performanse C modula smanjenjem ili potpunim uklanjanjem dodatnih troškova provjere stanja modula. Za povezivanje modula s klasom, predlaže se C-funkcija PyType_FromModuleAndSpec(), za dobivanje modula i njegovog stanja, predlažu se C-funkcije PyType_GetModule() i PyType_GetModuleState(), a za pružanje metode s pristupom klasi u kojem je definirana, predložena je C-funkcija PyCMethod i oznaka METH_METHOD. .
Sakupljač smeća dostavljeno od zaključavanja zbirki koje sadrže reanimirane objekte koji ostaju dostupni izvana nakon pokretanja finalizatora.
Dodana metoda os.pidfd_open, koji omogućuje podsustavu jezgre Linuxa "pidfd" da se koristi za obradu situacije ponovne upotrebe PID-a (pidfd je povezan s određenim procesom i ne mijenja se, dok se PID može povezati s drugim procesom nakon što trenutni proces povezan s tim PID-om završi ).
Podrška za Unicode specifikaciju ažurirana je na verziju 13.0.0.
Eliminiran curenje memorije prilikom reinicijalizacije Python interpretera u istom procesu.
Izvedba ugrađenih tipova range, tuple, set, frozenset, list i dict je optimizirana. implementiran korištenjem Vectorcall protokola prečaca za brži pristup objektima napisanim u C jeziku.
Moduli _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time i _weakref učitavaju se iz inicijalizacija u nekoliko faza.
Moduli standardne knjižnice audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios i zlib pretvoreni su u ograničenu upotrebu stabilan ABI, koji rješava problem operativnosti sklopova modula proširenja za različite verzije Pythona (prilikom ažuriranja verzije, nema potrebe za ponovnom izgradnjom modula proširenja, a moduli kompilirani za 3.9 moći će raditi u grani 3.10).
Modul asyncio obustavio je podršku za parametar reuse_address zbog mogućih sigurnosnih problema (upotreba SO_REUSEADDR za UDP na Linuxu omogućuje različitim procesima da prikače utičnice za slušanje na UDP priključak).
Dodane su nove optimizacije, na primjer, poboljšana izvedba rukovatelja signalima u aplikacijama s više niti, povećana brzina modula podprocesa u FreeBSD okruženju i brže dodjeljivanje privremenih varijabli (dodjeljivanje varijable u izrazu “za y u [izraz) ]” sada je jednako učinkovit kao izraz “y = expr”"). Općenito, većina testova predstava smanjenje performansi u usporedbi s granom 3.8 (ubrzanje se opaža samo u testovima write_local i write_deque):
Uklonjeno mnoge funkcije i metode Pythona 2.7 koje su prethodno bile zastarjele i rezultirale su DeprecationWarning u prethodnom izdanju, 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().