A Python 3.11 programozási nyelv kiadása

Egy év fejlesztés után megjelent a Python 3.11 programozási nyelv jelentős kiadása. Az új ágat másfél évig támogatják, majd további három és fél évig generálnak rá javításokat a sebezhetőségek kiküszöbölésére.

Ezzel egy időben megkezdődött a Python 3.12 ág alfa tesztelése (az új fejlesztési ütemtervnek megfelelően az új ágon a munka öt hónappal az előző ág megjelenése előtt kezdődik, és a következő kiadás idejére eléri az alfa tesztelési szakaszt ). A Python 3.12 ága hét hónapig lesz alfa kiadásban, ezalatt új funkciókat adnak hozzá, és javítják a hibákat. Ezt követően három hónapig tesztelik a béta verziókat, ezalatt tilos új funkciók hozzáadása, és minden figyelmet a hibák kijavítására fordítanak. A megjelenés előtti utolsó két hónapban az ág a kiadásjelölt szakaszban lesz, és ekkor kerül sor a végső stabilizálásra.

A Python 3.11 új kiegészítései a következők:

  • Jelentős munkát végeztek a teljesítmény optimalizálása érdekében. Az új ág a függvényhívások gyorsításával és soron belüli telepítésével, a szabványos műveletek gyors értelmezőinek használatával kapcsolatos változtatásokat tartalmaz (x+x, x*x, xx, a[i], a[i] = z, f(arg) C( arg), o.method(), o.attr = z, *seq), valamint a Cinder és a HotPy projektek által készített optimalizálások. A terhelés típusától függően 10-60%-kal nő a kódvégrehajtási sebesség. A pyperformance tesztcsomag teljesítménye átlagosan 25%-kal nőtt.

    A bájtkód gyorsítótárazási mechanizmust újratervezték, ami 10-15%-kal csökkentette a tolmács indítási idejét. A kóddal és bájtkóddal rendelkező objektumokat most statikusan lefoglalja az értelmező, ami lehetővé tette a gyorsítótárból kinyert bájtkód feloldásának és az objektumok dinamikus memóriába helyezendő kóddal való konvertálásának szakaszait.

  • A diagnosztikai üzenetekben a hívásnyomok megjelenítésekor most lehetőség van a hibát okozó kifejezés információinak megjelenítésére (korábban csak a vonal volt kiemelve, anélkül, hogy részletezték volna, hogy a vonal melyik része okozta a hibát). Kibővített nyomkövetési információk is beszerezhetők az API-n keresztül, és felhasználhatók az egyes bájtkód utasítások leképezésére a forráskód egy adott pozíciójára a codeobject.co_positions() metódus vagy a C API PyCode_Addr2Location() függvény használatával. A változtatás sokkal könnyebbé teszi a beágyazott szótárobjektumokkal, több funkcióhívással és összetett aritmetikai kifejezésekkel kapcsolatos problémák hibakeresését. Visszakövetés (utolsó hívás): "calculation.py" fájl, 54. sor, eredmény = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: osztás nullával
  • Kivételcsoportok támogatása, lehetővé téve a programnak, hogy egyszerre több különböző kivételt generáljon és dolgozzon fel. A több kivétel csoportosításához és összeállításához új kivételtípusokat javasoltak az ExceptionGroup és a BaseExceptionGroup, és hozzáadták az „except*” kifejezést, amely kiemeli a csoport egyes kivételeit.
  • Az add_note() metódus hozzáadásra került a BaseException osztályhoz, lehetővé téve szöveges megjegyzés csatolását a kivételhez, például olyan környezeti információk hozzáadását, amelyek a kivétel kidobásakor nem érhetők el.
  • Speciális Self típus hozzáadva az aktuális privát osztály képviseletéhez. A Self segítségével a TypeVar-nál egyszerűbb módon annotálhatunk olyan metódusokat, amelyek az osztály egy példányát adják vissza. class MyLock: def __enter__(self) -> Self: self.lock() return self
  • Hozzáadott egy speciális LiteralString típust, amely csak a LiteralString típussal kompatibilis karakterlánc-literálokat tartalmazhat (azaz bare és LiteralString karakterláncokat, de nem tetszőleges vagy kombinált str karakterláncokat). A LiteralString típus használható a karakterlánc-argumentumok függvényeknek való átadásának korlátozására, a karakterláncok részeinek tetszőleges helyettesítésére, ami sebezhetőséghez vezethet, például SQL-lekérdezések vagy shell-parancsok karakterláncainak generálásakor. def run_query(sql: LiteralString) -> ... ... def caller( tetszőleges_string: str, query_string: LiteralString, tábla_neve: LiteralString, ) -> None: run_query("SELECT * FROM tanulók") # ok run_query(literal_string) # ok run_query( "SELECT * FROM" + literal_string) # ok run_query(tetszőleges_karakterlánc) # Error run_query( # Error f"SELECT * FROM tanulók WHERE név = {tetszőleges_karakterlánc}" )
  • Bekerült a TypeVarTuple típus, amely lehetővé teszi a változó generikusok használatát, ellentétben a TypeVar-ral, amely nem egy típust takar, hanem tetszőleges számú típust.
  • A szabványos könyvtár tartalmazza a tomllib modult a TOML formátum elemzésére szolgáló függvényekkel.
  • Lehetőség van a gépelt szótárak (TypedDict) egyes elemeinek Required és NotRequired címkékkel való megjelölésére a kötelező és nem kötelező mezők meghatározásához (alapértelmezés szerint minden deklarált mező kötelező, ha a teljes paraméter értéke nem False). osztály Film(TypedDict): cím: str év: NotRequired[int] m1: Film = {"cím": "Fekete Párduc", "év": 2018} # OK m2: Film = {"cím": "Star Wars" } # OK (az év mező nem kötelező) m3: Film = {“év”: 2022} # Hiba, a kötelező cím mező nincs kitöltve)
  • A TaskGroup osztály hozzáadásra került az asyncio modulhoz egy aszinkron környezetkezelő megvalósításával, amely megvárja, amíg egy feladatcsoport befejeződik. A feladatok csoporthoz adása a create_task() metódussal történik. async def main(): async with asyncio.TaskGroup() as tg: task1 = tg.create_task(some_coro(...)) task2 = tg.create_task(anther_coro(...)) print("Mindkét feladat befejeződött .")
  • Hozzáadott @dataclass_transform dekorátor osztályokhoz, metódusokhoz és függvényekhez, ha meg van adva, a statikus típusellenőrző rendszer úgy kezeli az objektumot, mintha a @dataclasses.dataclass dekorátort használná. Az alábbi példában a CustomerModel osztály a típusok ellenőrzésekor a @dataclasses.dataclass dekorátorral rendelkező osztályhoz hasonlóan kerül feldolgozásra, azaz. mint egy __init__ metódussal, amely elfogadja az id és név változókat. @dataclass_transform() osztály ModelBase: … osztály CustomerModel(ModelBase): azonosító: int név: str
  • A reguláris kifejezésekben az atomi csoportosítás ((?>...)) és a birtokos kvantorok (*+, ++, ?+, {m,n}+) használatának lehetőségét adták hozzá.
  • A "-P" parancssori opció és a PYTHONSAFEPATH környezeti változó hozzáadva letiltja a potenciálisan nem biztonságos fájlútvonalak automatikus csatolását a sys.path fájlhoz.
  • A py.exe segédprogram a Windows platformon jelentősen javult, és a „-V:” szintaxis támogatásával bővült. / " továbbá "- . "
  • A C API-ban sok makrót normál vagy statikus soron belüli függvényekké alakítanak át.
  • Az uu, cgi, pipes, crypt, aifc, chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb, mailcap, ossaudiodev és sunau modulok elavultak, és eltávolításra kerülnek a Pythonból 3.13 kiadás. PyUnicode_Encode* függvények eltávolítva.

Forrás: opennet.ru

Hozzászólás