Po roce vývoje byl zveřejněn významný release programovacího jazyka Python 3.11. Nová větev bude podporována po dobu jednoho a půl roku, po čemž budou po další tři a půl roku vytvářena opravy zaměřená na odstranění zranitelností.
Současně začalo alfa testování větve Python 3.12 (podle nového plánu vývoje začíná práce na nové větvi pět měsíců před vydáním předchozí větve a v době příštího vydání dosahuje fáze alfa testování). Větev Python 3.12 bude v režimu alfa verzí po dobu sedmi měsíců, během nichž budou přidávány nové funkce a opravy chyb. Poté bude po dobu tří měsíců probíhat testování beta verzí, během kterého 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 větev v fázi kandidátů na vydání, na které proběhne finální stabilizace.
Mezi novinkami přidanými do Python 3.11 patří:
- Byla provedena významná práce na optimalizaci výkonu. Do nové větve byly zařazeny změny spojené se zrychlením a inline rozbalením volání funkcí, aplikací rychlých interpretátorů typových operací (x+x, x*x, x-x, a[i], a[i] = z, f(arg) C(arg), o.method(), o.attr = z, *seq), a také optimalizacemi připravenými projekty Cinder a HotPy. V závislosti na druhu zátěže je zaznamenán nárůst rychlosti provádění kódu o 10-60%. Průměrně se výkon při průchodu testovací sadou pyperformance zvýšil o 25%.
Byl přepracován mechanismus kešování bytecode, což umožnilo zkrátit dobu spuštění interpreteru o 10-15%. Objekty s kódem a bytecode nyní staticky umisťuje interpreter, což umožnilo vyloučit fáze de-maršalování vytaženého z keše bytecode a transformace objektů s kódem pro umístění v dynamické paměti.
- Při zobrazování trasování volání v diagnostických zprávách je nyní zajištěno, že se zobrazí informace o výrazu, který způsobil chybu (dříve se zvýrazňoval pouze řádek bez podrobností, která část řetězce byla příčinou chyby). Podrobné informace o trasování lze také získat prostřednictvím API a použít k přiřazení jednotlivých instrukcí bajtkódu k konkrétní pozici v zdrojovém kódu pomocí metody codeobject.co_positions() nebo funkce C API PyCode_Addr2Location(). Tato změna výrazně zjednodušuje ladění problémů spojených s vnořenými objekty slovníků, vícečetnými voláními funkcí a složitými aritmetickými výrazy. Traceback (most recent call last): File "calculation.py", line 54, in result = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: dělení nulou
- Byla přidána podpora skupin výjimek, což dává programu možnost generovat a zpracovávat současně více různých výjimek. Pro seskupení několika výjimek a jejich společné vyvolání byly navrženy nové typy výjimek ExceptionGroup a BaseExceptionGroup, a pro vyjmutí jednotlivých výjimek ze skupiny bylo přidáno výraz "except*".
- Do třídy BaseException byla přidána metoda add_note(), která umožňuje připevnit textovou poznámku k výjimce, například přidat kontextové informace, které nebyly k dispozici během generování výjimky.
- Byl přidán speciální typ Self, který představuje aktuální uzavřenou třídu. Self může být použit pro anotaci metod, které vracejí instanci své třídy, jednodušším způsobem, než při použití TypeVar. class MyLock: def __enter__(self) -> Self: self.lock() return self
- Byl přidán speciální typ LiteralString, který může zahrnovat pouze řetězcové literály kompatibilní s typem LiteralString (tj. prosté řetězce a řetězce typu LiteralString, nikoli libovolné a nekomponované řetězce typu str). Typ LiteralString lze použít pro omezení předávání řetězcových argumentů funkcím, kde volitelná substituce částí řetězců může vést k zranitelnostem, například při vytváření řetězců pro SQL dotazy nebo shellové příkazy. def run_query(sql: LiteralString) -> … … def caller( arbitrary_string: str, query_string: LiteralString, table_name: LiteralString, ) -> None: run_query(„SELECT * FROM students“) # ok run_query(literal_string) # ok run_query(„SELECT * FROM “ + literal_string) # ok run_query(arbitrary_string) # Chyba run_query( # Chyba f„SELECT * FROM students WHERE name = {arbitrary_string}“ )
- Byl přidán typ TypeVarTuple, který umožňuje používat variabilní generika, na rozdíl od TypeVar, který pokrývá nikoli jeden, ale libovolný počet typů.
- Do standardní knihovny byl zahrnut modul tomllib s funkcemi pro zpracování formátu TOML.
- Byla poskytnuta možnost označovat jednotlivé prvky typovaných slovníků (TypedDict) značkami Required a NotRequired pro určení povinných a nepovinných polí (ve výchozím nastavení jsou všechna deklarovaná pole povinná, pokud není parametr total nastaven na hodnotu False). class Movie(TypedDict): title: str year: NotRequired[int] m1: Movie = {„title“: „Black Panther“, „year“: 2018} # OK m2: Movie = {„title“: „Star Wars“} # OK (pole year je nepovinné) m3: Movie = {„year“: 2022} # Chyba, povinné pole title není vyplněno)
- Do modulu asyncio byl přidán třída TaskGroup s implementací asynchronního kontextového manažera, který čeká na dokončení skupiny úloh. Přidávání úloh do skupiny probíhá pomocí metody create_task(). async def main(): async with asyncio.TaskGroup() as tg: task1 = tg.create_task(some_coro(…)) task2 = tg.create_task(another_coro(…)) print(„Obě úlohy byly nyní dokončeny.“)
- Byl přidán dekorátor tříd, metod a funkcí @dataclass_transform, při jehož použití systém kontroly statických typů zpracovává objekt jako při použití dekorátoru @dataclasses.dataclass. V následujícím příkladu bude třída CustomerModel při kontrole typů zpracována jako třída s dekorátorem @dataclasses.dataclass, tj. jako má metodu __init__, která přijímá proměnné id a name. @dataclass_transform() class ModelBase: … class CustomerModel(ModelBase): id: int name: str
- Ve regulárních výrazech byla přidána možnost použití atomární skupiny ((?>…)) a žárlivých (possessive) kvantifikátorů (*+, ++, ?+, {m,n}+).
- Byla přidána volba příkazového řádku „-P“ a proměnná prostředí PYTHONSAFEPATH pro zakázání automatického připojování potenciálně nebezpečných cest k sys.path.
- Významně byla vylepšena utilita py.exe pro platformu Windows, která nyní podporuje syntaxi „-V:<company>/<tag>“ vedle „-<major>.<minor>“.
- Mnoho maker v C API bylo převedeno na běžné nebo statické inline funkce.
- Byly označeny jako zastaralé a budou odstraněny ve verzi Python 3.13 moduly uu, cgi, pipes, crypt, aifc, chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb, mailcap, ossaudiodev a sunau. Funkce PyUnicode_Encode* byly odstraněny.
Zdroj: opennet.ru
