A Python 3.11 programozási nyelv jelentős kiadása után egy év fejlesztés után jelent meg. Az új ág másfél évig lesz támogatva, ezt követően még három és fél évig hibajavító frissítések készülnek hozzá.
Ezzel párhuzamosan megkezdődött a Python 3.12 ág alfa-tesztelése is (az új fejlesztési ütemterv szerint a munka az új ágon az előző ág kiadása előtt öt hónappal kezdődik, és az újabb kiadás pillanatában alfa-tesztelés állapotába jut). A Python 3.12 ág hét hónapig alfa-kiadási fázisban lesz, ezalatt új funkciók kerülnek bevezetésre és hibajavításokra kerül sor. Ezt követően három hónapos bétatesztelési időszak következik, amely alatt új funkciók bevezetése tilos, és a figyelem a hibák javítására összpontosít. Az utolsó két hónapban a kiadásra jelölt állapotban lesz, ahol a végső stabilizációra kerül sor.
A Python 3.11 újdonságai közé tartozik:
- Jelentős munkálatok zajlottak a teljesítményoptimalizálás terén. Az új ág tartalmazza a funkciók gyorsításához és inline-dekorálásához, a gyakori műveletek gyorsító értelmezőinek (x+x, x*x, x-x, a[i], a[i] = z, f(arg) C(arg), o.method(), o.attr = z, *seq) alkalmazásához kapcsolódó változásokat, valamint a Cinder és HotPy projektek által készített optimalizációkat. A terhelés fajtájától függően a kód végrehajtási sebessége 10-60%-kal nőtt. Átlagosan a pyperformance teszthalmazon a teljesítmény 25%-kal nőtt.
Átdolgozták a bájt-kód gyorsítótárazási mechanizmusát, ami lehetővé tette az interpreter indítási idejének 10-15%-kal történő csökkentését. A kód és a bájt-kód objektumait most statikusan osztja ki az interpreter, ami lehetővé tette a cache-ből kiolvasott bájt-kód demarshaling stádiumának és a kódobjektumok dinamikus memóriahelyre történő elhelyezésének eltávolítását.
- A hívási nyomok megjelenítésénél a diagnosztikai üzenetekben információ jelenik meg azokról a kifejezésekről, amelyek miatt a hiba történt (korábban csak a sor volt kiemelve, részletezés nélkül, hogy melyik rész okozta a hibát). A hívásnyomok kiterjesztett információi az API-n keresztül is elérhetők, és a bytecode egyes utasításainak a forráskódban található konkrét pozíciókkal való összehasonlítására használhatók a codeobject.co_positions() módszer vagy a C API PyCode_Addr2Location() függvény segítségével. A módosítás lényegesen megkönnyíti a hibák elhárítását a beágyazott dictionary objektumokkal, a többszörös függvényhívásokkal és a bonyolult matematikai kifejezésekkel kapcsolatban. Traceback (most recent call last): File «calculation.py», line 54, in result = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: division by zero
- Hozzáadásra került a kivételek csoportjának támogatása, amely lehetővé teszi a program számára, hogy egyszerre több különböző kivételt generáljon és kezeljen. A több kivétel csoportosításához és közös hívásukhoz új kivételtípusokat, az ExceptionGroup-t és a BaseExceptionGroup-ot vezették be, az egyes kivételek csoporton belüli elkülönítéséhez pedig hozzáadták az „except*” kifejezést.
- A BaseException osztályhoz hozzáadódott az add_note() módszer, amely lehetővé teszi a szöveges megjegyzés csatolását a kivételhez, például a kivétel generálásakor elérhetetlen kontextuális információk hozzáadását.
- Hozzáadódott egy speciális Self típus, amely a jelenlegi zárt osztályt képviseli. A Self alkalmazható a saját osztályuk példányát visszaadó módszerek annotálására egyszerűbb módon, mint a TypeVar használatával. class MyLock: def __enter__(self) -> Self: self.lock() return self
- Bevezetésre került a LiteralString speciális típus, amely csak a LiteralString típusnak megfelelő szöveges literálokat tartalmazhat (azaz nyers sztringek és LiteralString típusú sztringek, de nem tetszőleges vagy kombinált str típusú sztringek). A LiteralString típust használhatjuk a szöveges argumentumok funkciókhoz való továbbításának korlátozására, ahol a szöveg véletlenszerű behelyettesítése sebezhetőségekhez vezethet, például SQL-lekérdezések vagy shell-parancsok formálásakor. 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) # Hiba run_query( # Hiba f"SELECT * FROM students WHERE name = {arbitrary_string}" )
- Bevezetésre került a TypeVarTuple típus, amely lehetővé teszi a változó generikus típusok használatát, ellentétben a TypeVar típussal, amely nem egy, hanem tetszőleges számú típust ölel fel.
- A standard könyvtárhoz hozzá lett adva a tomllib modul, amely funkciókat tartalmaz a TOML formátum elemzésére.
- Lehetőség nyílt arra, hogy a típusszótárak (TypedDict) egyes elemeit Required és NotRequired címkékkel lássuk el, meghatározva a kötelező és nem kötelező mezőket (alapértelmezés szerint minden bejelentett mező kötelező, ha a total paramétert nem állítjuk False-ra). class Movie(TypedDict): title: str year: NotRequired[int] m1: Movie = {"title": "Black Panther", "year": 2018} # OK m2: Movie = {"title": "Star Wars"} # OK (a year mező nem kötelező) m3: Movie = {"year": 2022} # Hiba, a kötelező title mező nincs kitöltve)
- Az asyncio modulhoz hozzá lett adva a TaskGroup osztály, amely megvalósít egy aszinkron kontextuskezelőt, amely egy feladatcsoport befejezésére vár. Feladatok hozzáadása a csoporthoz 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(another_coro(…)) print("Most már mindkét feladat befejeződött.")
- Bevezetésre került a @dataclass_transform dekorátor osztályokhoz, metódusokhoz és függvényekhez, amelynek megadásakor a statikus típusellenőrző rendszer az objektumot úgy kezeli, mintha a @dataclasses.dataclass dekorátort használnák. Az alábbi példában a CustomerModel osztályt a típusellenőrzés során a @dataclasses.dataclass dekorátorral rendelkező osztályhoz hasonlóan dolgozzák fel, vagyis mint amelynek __init__ metódusa van, amely az id és name változókat fogadja. @dataclass_transform() class ModelBase: … class CustomerModel(ModelBase): id: int name: str
- A reguláris kifejezésekhez hozzáadódott az atomáris csoportosítás használatának lehetősége ((?>…)) és a féltékeny (posseszív) kvantorok (*+, ++, ?+, {m,n}+).
- Hozzáadva a parancssori opciót: «-P» és a PYTHONSAFEPATH környezeti változó az automatikus csatolás kikapcsolásához a sys.path-hez potenciálisan nem biztonságos fájlpályákhoz.
- Jelentősen javítva lett a py.exe segédprogram Windows platformra, amely támogatja a «-V:<company><tag>» szintaxist, a «-<major>.<minor>» mellett.
- Sok makrót a C API-ban normál vagy statikus inline-funkciókká alakítottak.
- Elavultnak nyilvánították, és törlésre kerülnek a Python 3.13 kiadásában az uu, cgi, pipes, crypt, aifc, chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb, mailcap, ossaudiodev és sunau modulok. Törölték a PyUnicode_Encode* funkciókat.
Forrás: opennet.ru
