Po roce vývoje prezentovány významné vydání programovacího jazyka Python 3.9. Python 3.9 byl prvním vydáním poté přechod projekt na nový cyklus příprava a podpora vydání. Nové hlavní verze budou nyní generovány jednou ročně a opravné aktualizace budou vydávány každé dva měsíce. Každá významná větev bude podporována po dobu jednoho a půl roku a poté bude dalších tři a půl roku vyvíjena na opravu zranitelností.
Práce na nové pobočce nyní začínají pět měsíců před vydáním další pobočky, tzn. současně s vydáním Pythonu 3.9 začal alfa testování větve Python 3.10. Větev Pythonu 3.10 bude ve verzi alfa sedm měsíců, během kterých budou přidávány nové funkce a opraveny chyby. Poté budou betaverze testovány po dobu tří měsíců, během kterých bude zakázáno přidávání nových funkcí a veškerá pozornost bude věnována opravám chyb. Poslední dva měsíce před vydáním bude pobočka ve fázi kandidáta na vydání, kdy bude provedena finální stabilizace.
Ve slovnících definovaných pomocí vestavěné třídy dict, se objevil podpora pro operátory sloučení "|" a aktualizace "|=", které doplňují metody {**d1, **d2} a dict.update dříve navržené pro slučování slovníků.
>>> x = {"klíč1": "hodnota1 z x", "klíč2": "hodnota2 z x"}
>>> y = {"klíč2": "hodnota2 z y", "klíč3": "hodnota3 z 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'}
Vestavěná kolekce typů zahrnuje seznam, diktát a n-tice, které lze použít jako základní typy bez importu z modulu pro psaní. Tito. místo typing.List, typeing.Dict a typing.Tuple nyní můžete zadat
stačí vyjmenovat, diktovat a n-tice:
def greet_all(names: list[str]) -> None:
pro jméno ve jménech:
tisknout("Ahoj", jméno)
Jsou poskytovány flexibilní nástroje pro anotaci funkcí a proměnných. Pro připojení anotací byl do typovacího modulu přidán nový typ s poznámkami, který rozšiřuje stávající typy o další metadata, která lze použít pro statickou analýzu nebo pro optimalizaci za běhu. Pro přístup k metadatům z kódu byl do metody typing.get_type_hints() přidán parametr include_extras.
Zmírněno gramatické požadavky na dekoratéry – jako dekoratér lze nyní použít jakýkoli výraz vhodný pro použití v blocích if a while. Změna výrazně zlepšila čitelnost kódu PyQt5 a zjednodušila údržbu tohoto modulu:
Bylo to:
button_0 = buttons[0] @button_0.clicked.connect
Nyní můžete napsat:
@buttons[0].clicked.connect
Do standardní knihovny přidal modulu info o zóně, která obsahuje informace z databáze časových pásem IANA.
>>> z zoneinfo import ZoneInfo
>>> from datetime import datetime, timedelta
>>> # Letní čas
>>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("Amerika/Los_Angeles"))
>>> tisk (dt)
2020-10-31 12:00:00-07:00
>>> dt.tzname()
'PDT'
>>> # Standardní čas
>>> dt += timedelta(dny=7)
>>> tisk (dt)
2020-11-07 12:00:00-08:00
>>> print(dt.tzname())
PST
Přidán modul graphlib, ve kterém implementováno podpora topologického řazení grafů.
Navrženo nové metody odstraňování předpon a zakončení řádků - str.removeprefix(prefix) a str.removesuffix(suffix). Metody byly přidány do objektů str, bytes, bytearray a collections.UserString.
>>> s = "FooBar"
>>> s.removeprefix("Foo")
'Bar'
Zapojený nový parser PEG (Parsing Expression Grammar), který nahradil analyzátor LL(1). Použití nového analyzátoru umožnilo zbavit se některých „hacků“ používaných k obcházení omezení v LL(1) a výrazně snížilo mzdové náklady na údržbu analyzátoru. Z hlediska výkonu je nový parser přibližně na stejné úrovni jako předchozí, ale výrazně před ním z hlediska flexibility, což vám umožňuje cítit se svobodněji při navrhování nových jazykových funkcí. Starý kód analyzátoru je prozatím zachován a lze jej vrátit pomocí příznaku "-X oldparser" nebo proměnné prostředí "PYTHONOLDPARSER=1", ale ve verzi 3.10 bude odstraněn.
Pokud schopnost metod rozšíření C přistupovat ke stavu modulů, ve kterých jsou definovány, pomocí přímé dereference ukazatele namísto hledání stavu modulu pomocí funkce PyState_FindModule. Změna umožňuje zvýšit výkon modulů C snížením nebo úplným odstraněním režie na kontrolu stavu modulu. Pro přidružení modulu ke třídě je navržena C-funkce PyType_FromModuleAndSpec(), pro získání modulu a jeho stavu jsou navrženy C-funkce PyType_GetModule() a PyType_GetModuleState() a pro poskytnutí metody s přístupem ke třídě ve kterém je definována, je navržena C-funkce PyCMethod a příznak METH_METHOD.
Popelář doručeno z uzamčení kolekcí obsahujících reanimované objekty, které zůstávají po spuštění finalizátoru externě přístupné.
Přidána metoda os.pidfd_open, který umožňuje použití linuxového kernelového subsystému „pidfd“ k řešení situace opětovného použití PID (pidfd je spojen s konkrétním procesem a nemění se, zatímco PID může být spojen s jiným procesem poté, co aktuální proces spojený s tímto PID skončí ).
Podpora specifikace Unicode byla aktualizována na verzi 13.0.0.
Vyřazeno únik paměti při reinicializaci interpretru Pythonu ve stejném procesu.
Byl optimalizován výkon vestavěných typů range, tuple, set, frozenset, list a dict. implementováno díky použití zkratkového protokolu Vectorcall pro rychlejší přístup k objektům napsaným v jazyce C.
Moduly _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time a _weakref se načítají z inicializace v několika fázích.
Standardní knihovní moduly audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios a zlib byly převedeny na omezené použití stabilní ABI, který řeší problém provozuschopnosti sestav rozšiřujících modulů pro různé verze Pythonu (při aktualizaci verze není potřeba přestavovat rozšiřující moduly a moduly zkompilované pro 3.9 budou moci pracovat ve větvi 3.10).
Modul asyncio má zastaralou podporu pro parametr reuse_address kvůli potenciálním bezpečnostním problémům (použití SO_REUSEADDR pro UDP na Linuxu umožňuje různým procesům připojit naslouchající sokety k portu UDP).
Byly přidány nové optimalizace, například zlepšený výkon signálových handlerů ve vícevláknových aplikacích, zvýšená rychlost modulu subprocess v prostředí FreeBSD a rychlejší přiřazování dočasných proměnných (přiřazení proměnné ve výrazu „for y in [expr ]“ je nyní stejně výkonný jako výraz „y = expr“ “). Obecně většina testů show pokles výkonu ve srovnání s větví 3.8 (zrychlení je pozorováno pouze v testech write_local a write_deque):
Odebráno mnoho funkcí a metod Pythonu 2.7, které byly dříve zastaralé a vedly k upozornění DeprecationWarning v předchozí verzi, včetně metody unescape() v html.parser.HTMLParser,
tostring() a fromstring() v array.array, isAlive() v threading.Thread, getchildren() a getiterator() v ElementTree, sys.getcheckinterval(), sys.setcheckinterval(), asyncio.Task.current_task(), asyncio.Task.all_tasks(), base64.encodestring() a base64.decodestring().