Po roku vývoja bol predstavený významný vydanie programovacieho jazyka Python 3.10. Nová vetva bude podporovaná počas jeden a pol roka, po ktorom budú tri a pol roka vytvárané opravy na odstránenie zraniteľností.
Zároveň začalo alfa testovanie vetvy Python 3.11 (v súlade s novým plánom vývoja, práca na novej vetve sa začína päť mesiacov pred vydaním predchádzajúcej vetvy a v čase ďalšieho vydania dosahuje štádium alfa testovania). Vetva Python 3.11 bude v štádiu alfa vydaní počas siedmich mesiacov, počas ktorých budú pridávané nové funkcie a opravované chyby. Potom počas troch mesiacov prebehne testovanie beta verzií, počas ktorého bude zakázané pridávať nové funkcie a všetka pozornosť sa sústredí na opravu chýb. Posledné dva mesiace pred vydaním bude vetva v štádiu kandidátov na vydanie, na ktorom sa vykoná finálna stabilizácia.
Medzi novinkami pridanými do Python 3.10 sú:
- Implementované operátory „match“ a „case“ na vzorové porovnávanie, ktoré zlepšujú čitateľnosť kódu, zjednodušujú porovnávanie ľubovoľných Python objektov a zvyšujú spoľahlivosť kódu vďaka možnosti rozšírenej statickej kontroly typov. Implementácia sa do veľkej miery podobá operátoru „match“, poskytovanému v jazykoch Scala, Rust a F#, ktorý porovnáva výsledok vykonania určeného výrazu so zoznamom vzorov uvedených v blokoch na základe operátora „case“.
def http_error(status): match status: case 400: return "Bad request" case 401|403|404: return "Not allowed" case 418: return "I’m a teapot" case _: return "Something else"
Možné je rozbalenie objektov, n-tíc, zoznamov a rôznych sekvencií pre priradenie premenných na základe existujúcich hodnôt. Povolené je definovanie vnorených šablón, používanie dodatočných podmienok „if“ v šablónach, použitie masiek („[x, y, *rest]“), mapovanie párov kľúč/hodnota (napríklad {„bandwidth“: b, „latency“: l} na extrakciu hodnôt „bandwidth“ a „latency“ zo slovníka), extrakcia podšablón (operátor „:=“), používanie pomenovaných konštánt v šablónach. V triedach je možné nastaviť správanie pri porovnávaní pomocou metódy „__match__()“.
from dataclasses import dataclass @dataclass class Point: x: int y: int def whereis(point): match point: case Point(0, 0): print(„Origin“) case Point(0, y): print(f„Y={y}“) case Point(x, 0): print(f„X={x}“) case Point(): print(„Somewhere else“) case _: print(„Not a point“) match point: case Point(x, y) if x == y: print(f„Y=X at {x}“) case Point(x, y): print(f„Not on the diagonal“) RED, GREEN, BLUE = 0, 1, 2 match color: case RED: print(„I see red!“) case GREEN: print(„Grass is green“) case BLUE: print(„I’m feeling the blues :(„)
- Poskytla sa možnosť používať okrúhle zátvorky v príkaze with na rozdelenie definície kolekcie kontextových manažérov na niekoľko riadkov. Okrem toho je povolené nechať čiarku za posledným kontextovým manažérom v skupine: with ( CtxManager1() as example1, CtxManager2() as example2, CtxManager3() as example3, ): …
- Zlepšilo sa informovanie o umiestnení v kóde chýb spojených s nezatvorenými zloženými zátvorkami a úvodzovkami v literáloch reťazcov. Napríklad, pri nezatvorenej zloženej zátvorke namiesto informovania o chybe syntaktického poradia v nasledujúcej konštrukcii, ukazovateľ teraz zvýrazňuje otváraciu zloženú zátvorku a informuje o chýbajúcom zatváracom bloku. File „example.py“, line 1 expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4, ^ SyntaxError: ‘{‘ was never closed
Boli pridané ďalšie špecializované chybové správy o syntaktických chybách: chýbajúci znak „:“ pred blokom a vo slovníkoch, nevytvorenie n-tice pomocou zátvoriek, chýbajúca čiarka v zoznamoch, uvedenie bloku „try“ bez „except“ a „finally“, použitie „=” namiesto „==“ v porovnaniach, uvedenie *-výrazov v f-řetazcoch. Okrem toho je zabezpečené zvýraznenie celého problematického výrazu, nie len jeho začiatku, a jasnejšie informovanie o kontexte chýb spojených s nesprávnym zarovnaním odstavcov. >>> def foo(): … if lel: … x = 2 File „“, line 3 x = 2 ^ IndentationError: očakával sa odsadený blok po vyhlásení „if“ na riadku 2
Pri chybách spôsobených preklepmi v názve atribútov a mien premenných vo funkciách je zabezpečené zobrazenie odporúčania s správnym menom. >>> collections.namedtoplo Traceback (most recent call last): File „“, line 1, in AttributeError: modul „collections“ nemá atribút „namedtoplo“. Nemysleli ste: namedtuple?
- Pre ladicí nástroje a profilovače je zabezpečené uvádzanie presných čísel riadkov vykonaného kódu v sledovacích udalostiach.
- Bola pridaná nastavenie sys.flags.warn_default_encoding na zobrazenie varovného oznámenia o potenciálnych chybách súvisiacich s spracovaním v TextIOWrapper a open() súboroch v kódovaní UTF-8 bez jasného určenia možnosti ‚encoding="utf-8"‘ (predvolene sa používa kódovanie ASCII). V novej verzii bol tiež pridaný možnosť určenia hodnoty ‚encoding="locale"‘ na nastavenie kódovania na základe aktuálnej lokality.
- Do modulu typing, ktorý poskytuje prostriedky na zadávanie typových anotácií, bol pridaný nový operátor, ktorý umožňuje používať syntax „X | Y“ na vyberanie medzi dvoma typmi (typ X alebo typ Y). def square(number: int | float) -> int | float: return number ** 2 je ekvivalentné predtým podporovanej konštrukcii: def square(number: Union[int, float]) -> Union[int, float]: return number ** 2
- Do modulu typing bol pridaný operátor Concatenate a premenná ParamSpec, ktoré umožňujú predávať dodatočné informácie pre statickú kontrolu typov pri použití Callable. Do modulu typing boli tiež pridané špeciálne hodnoty TypeGuard pre anotáciu funkcií ochrany typov a TypeAlias na explicitné definovanie aliasu typu. StrCache: TypeAlias = ‘Cache[str]’ # alias typu
- Vo funkcii zip() je implementovaná voliteľná vlajka „strict“, pri ktorej sa kontroluje, či sú prechádzajúce argumenty rovnakej dĺžky. >>> list(zip((‘a’, ‘b’, ‘c’), (1, 2, 3), strict=True)) [(‘a’, 1), (‘b’, 2), (‘c’, 3)] >>> list(zip(range(3), [‘fee’, ‘fi’, ‘fo’, ‘fum’], strict=True)) Traceback (most recent call last): … ValueError: zip() argument 2 je dlhší ako argument 1
- Navrhnuté nové vstavané funkcie aiter() a anext() s implementáciou asynchrónnych ekvivalentov funkciám iter() a next().
- Práca konštruktorov str(), bytes() a bytearray() bola zrýchlená o 30-40% pri práci s malými objektmi.
- Počet importných operácií v module runpy bol znížený. Príkaz „python3 -m meno_modulu“ sa teraz spúšťa v priemere o 1,4-krát rýchlejšie vďaka zníženiu počtu importovaných modulov z 69 na 51.
- V inštrukcii LOAD_ATTR bol zapojený mechanizmus caching pre jednotlivé opkódy, ktorý umožnil zrýchliť výkon s bežnými atribútmi o 36%, a so slotmi o 44%.
- Pri kompilácii Pythonu s voľbou „—enable-optimizations“ sa teraz zapína režim „-fno-semantic-interposition“, ktorý umožňuje v porovnaní s kompiláciou s voľbou „—enable-shared“ zrýchliť prácu interpretera o 30%.
- V moduloch hashlib a ssl bola pridaná podpora pre OpenSSL 3.0.0 a podpora verzií OpenSSL starších ako 1.1.1 bola ukončená.
- Starý parser bol odstránený, pričom bol nahradený parserom PEG (Parsing Expression Grammar) z predchádzajúcej vetvy. Modul formatter bol odstránený. Z API asyncio bol odstránený parameter loop. Boli odstránené metódy, ktoré boli predtým označené za zastarané. Odstránili sa funkcie Py_UNICODE_str*, manipulujúce so stringmi Py_UNICODE*.
- Modul distutils bol označený ako zastaraný a plánuje sa odstrániť v Python 3.12. Namiesto distutils sa odporúča používať moduly setuptools, packaging, platform, shutil, subprocess a sysconfig. Štruktúra wstr bola preložená medzi zastarané a plánované na odstránenie v PyUnicodeObject.
Zdroj: opennet.ru
