Vydání programovacího jazyka Python 3.11

Po roce vývoje byla zveřejněna významná verze programovacího jazyka Python 3.11. Nová větev bude podporována rok a půl, poté se pro ni budou další tři a půl roku tvořit záplaty se zranitelností.

Zároveň začalo alfa testování větve Pythonu 3.12 (v souladu s novým harmonogramem vývoje začínají práce na nové větvi pět měsíců před vydáním předchozí větve a do fáze alfa testování se dostanou do příštího vydání ). Větev Pythonu 3.12 bude ve verzích alfa po dobu sedmi měsíců, během kterých budou přidávány nové funkce a opraveny chyby. Poté bude probíhat beta testování 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.

Mezi nové přírůstky v Pythonu 3.11 patří:

  • Pro optimalizaci výkonu byla odvedena značná práce. Nová větev zahrnuje změny týkající se zrychlení a inline-nasazení volání funkcí, použití rychlých interpretů typických operací (x+x, x*x, xx, a[i], a[i] = z, f( arg) C( arg), o.method(), o.attr = z, *seq), stejně jako optimalizace připravené projekty Cinder a HotPy. V závislosti na typu zatížení dochází ke zvýšení rychlosti provádění kódu o 10-60%. V průměru se výkon při absolvování testovací sady pyperformance zvýšil o 25 %.

    Mechanismus ukládání do mezipaměti bytecode byl přepracován, což zkrátilo dobu spouštění interpretu o 10–15 %. Objekty s kódem a bajtkódem jsou nyní staticky alokovány interpretem, což umožnilo eliminovat fáze demarshalingu bytecode extrahovaného z mezipaměti a převodu objektů s kódem pro umístění do dynamické paměti.

  • Při zobrazení trasování hovorů v diagnostických zprávách je poskytnuta informace o výrazu, který způsobil chybu (dříve byl zvýrazněn pouze řádek bez podrobností o tom, která část řádku chybu způsobila). Rozšířené informace o sledování lze také získat prostřednictvím API a použít k mapování jednotlivých instrukcí bajtového kódu na konkrétní pozici ve zdrojovém kódu pomocí metody codeobject.co_positions() nebo funkce PyCode_Addr2Location() C API. Tato změna výrazně zjednodušuje problémy s laděním související s vnořenými objekty slovníku, vícenásobným voláním funkcí a složitými aritmetickými výrazy. Zpětné sledování (poslední poslední volání): Soubor "calculation.py", řádek 54, ve výsledku = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: dělení nulou
  • Přidána podpora pro skupiny výjimek, což dává programu možnost generovat a zpracovávat několik různých výjimek současně. Nové typy výjimek ExceptionGroup a BaseExceptionGroup jsou navrženy pro seskupení několika výjimek a jejich společné vyvolání a výraz "kromě*" je přidán k samostatným výjimkám ze skupiny.
  • Do třídy BaseException byla přidána metoda add_note() , která vám umožňuje připojit k výjimce textovou poznámku, například přidat kontextové informace, které nejsou dostupné v době vyvolání výjimky.
  • Byl přidán speciální typ Self, který představuje aktuální soukromou třídu. Self lze použít k anotaci metod, které vracejí instanci své třídy jednodušším způsobem než pomocí TypeVar. class MyLock: def __enter__(self) -> Self: self.lock() return self
  • Byl přidán speciální typ LiteralString, který může obsahovat pouze řetězcové literály, které jsou kompatibilní s typem LiteralString (tj. holé řetězce a řetězce typu LiteralString, ale ne libovolné nebo kombinované řetězce typu str). Typ LiteralString lze použít k omezení předávání řetězcových argumentů funkcím, libovolná záměna částí řetězců, ve kterých může vést k zranitelnosti, například při generování řetězců pro SQL dotazy nebo příkazy shellu. 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) # Error run_query( # Error f"SELECT * FROM students WHERE name = {arbitrary_string}" )
  • Byl přidán typ TypeVarTuple, který na rozdíl od TypeVar umožňuje použití variabilních generik pokrývajících nikoli jeden typ, ale libovolný počet typů.
  • Standardní knihovna obsahuje modul tomllib s funkcemi pro analýzu formátu TOML.
  • Možnost označit jednotlivé prvky typových slovníků (TypedDict) značkami Required a NotRequired je poskytována pro určení povinných a volitelných polí (standardně jsou všechna deklarovaná pole povinná, pokud celkový parametr není nastaven na False). class Movie(TypedDict): title: str rok: Nevyžadováno[int] m1: Movie = {"title": "Black Panther", "year": 2018} # OK m2: Movie = {"title": "Star Wars" } # OK (pole roku je volitelné) m3: Film = {"rok": 2022} # Chyba, požadované pole názvu nebylo vyplněno)
  • Třída TaskGroup byla přidána do modulu asyncio s implementací asynchronního správce kontextu, který čeká na dokončení skupiny úkolů. Přidávání úkolů do skupiny se provádí pomocí metody create_task(). async def main(): async s asyncio.TaskGroup() as tg: task1 = tg.create_task(some_coro(…)) task2 = tg.create_task(another_coro(…)) print("Oba úkoly jsou nyní dokončeny.")
  • Byl přidán dekorátor tříd, metod a funkcí @dataclass_transform, když je zadán, statická kontrola typu zachází s objektem, jako by používal dekorátor @dataclasses.dataclass. V níže uvedeném příkladu bude třída CustomerModel typově zkontrolována stejným způsobem jako třída s dekorátorem @dataclasses.dataclass, tzn. jako mající metodu __init__, která umožňuje proměnné id a name. @dataclass_transform() class ModelBase: … class CustomerModel(ModelBase): id: int name: str
  • Přidána možnost používat atomové seskupení ((?>…)) a žárlivé (vlastnické) kvantifikátory (*+, ++, ?+, {m,n}+) v regulárních výrazech.
  • Přidána možnost 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 souboru k sys.path.
  • Výrazně vylepšený nástroj py.exe pro platformu Windows, který nyní podporuje syntaxi "-V:". / " navíc "- . ".
  • Mnoho maker v C API bylo převedeno na normální nebo statické inline funkce.
  • Moduly uu, cgi, pipes, crypt, aifc, chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb, mailcap, ossaudiodev a sunau byly zastaralé a budou z Pythonu odstraněny vydání 3.13. Odstraněné funkce PyUnicode_Encode*.

Zdroj: opennet.ru

Přidat komentář