Vydání programovacího jazyka Python 3.10

Po roce vývoje byl představen významný release programovacího jazyka Python 3.10. Nová větev bude podporována po dobu jednoho a půl roku, po kterém budou další tři a půl roku vytvářeny opravy zaměřené na odstranění zranitelností.

Současně začalo alpha testování větve Python 3.11 (podle nového vývojového plánu 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ě dalšího vydání dosahuje fáze alpha testování). Větev Python 3.11 bude v alfa verzi po dobu sedmi měsíců, během nichž budou přidávány nové možnosti a prováděny opravy chyb. Poté bude po dobu tří měsíců probíhat beta testování, během něhož nebude povoleno 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 se větev nachází v fázi release candidate, kde bude provedena konečná stabilizace.

Mezi novinkami přidanými do Python 3.10 patří:

  • Byly implementovány operátory „match“ a „case“ pro vzorové porovnání, které zlepšují čitelnost kódu, usnadňují porovnání libovolných Python objektů a zvyšují spolehlivost kódu díky možnosti rozšířené statické kontroly typů. Implementace do značné míry připomíná operátor „match“, poskytovaný v jazycích Scala, Rust a F#, který provádí srovnání výsledku uvedeného výrazu se seznamem vzorů uvedených v blocích na základě operátoru „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"

    Je možné rozbalit objekty, n-tice, seznamy a libovolné sekvence pro přiřazování proměnných na základě dostupných hodnot. Povolené je definování vnořených šablon, použití dalších podmínek 'if' v šabloně, aplikování masek ('[x, y, *rest]'), mapování párů klíč/hodnota (například, {'bandwidth': b, 'latency': l} pro extrakci hodnot 'bandwidth' a 'latency' z dict), extrakce podsablon (operátor ':='), a používání pojmenovaných konstant v šabloně. V třídách je možné nastavovat chování při přiřazení pomocí metody '__match__()'.

    from dataclasses import dataclass @dataclass class Point: x: int y: int def whereis(point): match point: case Point(0, 0): print('Původ') case Point(0, y): print(f'Y={y}') case Point(x, 0): print(f'X={x}') case Point(): print('Někde jinde') case _: print('Není to bod') match point: case Point(x, y) if x == y: print(f'Y=X na {x}') case Point(x, y): print(f'Není to na diagonále') RED, GREEN, BLUE = 0, 1, 2 match color: case RED: print('Vidím červenou!') case GREEN: print('Tráva je zelená') case BLUE: print('Cítím blues :(')

  • Byla zavedená možnost použití kulatých závorek v operatoru with pro rozložení definice kolekce kontextových manažerů na několik řádků. To zahrnuje povolení ponechat čárku po posledním kontextovém manažeru ve skupině: with ( CtxManager1() as example1, CtxManager2() as example2, CtxManager3() as example3, ): …
  • Bylo vylepšeno informování o umístění v kódu chyb, které souvisejí s nezavřenými složenými závorkami a uvozovkami ve string literálech. Například při nezavřené složené závorce místo informování o syntaktické chybě v následující konstrukci, nyní ukazatel zvýrazňuje otevírací složenou závorku a informuje o chybějícím uzavřené 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

    Byly přidány další specializované zprávy o syntaktických chybách: chybějící symbol „:“ před blokem a ve slovnících, neuzavření n-tice závorkami, chybějící čárka v seznamech, uvedení bloku „try“ bez „except“ a „finally“, použití „=“ místo „==“ v porovnáních, specifikace *-výrazů v f-řetězcích. Kromě toho bylo zajištěno zvýraznění celého problematického výrazu, nikoli pouze jeho začátku, a jasnější informování o kontextu chyb spojených s nesprávným odsazením. >>> def foo(): … if lel: … x = 2 Soubor „“, řádek 3 x = 2 ^ IndentationError: očekává se odsazený blok po příkazu 'if' na řádku 2

    V chybách způsobených překlepy v názvech atributů a proměnných ve funkci je zajištěno zobrazení doporučení s správným názvem. >>> collections.namedtoplo Sledování (poslední volání provedeno naposledy): Soubor „“, řádek 1, v AttributeError: modul 'collections' nemá atribut 'namedtoplo'. Měli jste na mysli: namedtuple?

  • Pro ladicí nástroje a profilers je zajištěno, že budou uvedeny přesné čísla řádků provedeného kódu v událostech stopování.
  • Byla přidána konfigurace sys.flags.warn_default_encoding pro výstup varování o potenciálních chybách spojených s zpracováním ve TextIOWrapper a open() souborech v kódování UTF-8 bez explicitního určení možnosti 'encoding="utf-8"' (ve výchozím nastavení se používá kódování ASCII). Také v nové verzi byla poskytnuta možnost specifikace hodnoty 'encoding="locale"' pro nastavení kódování na základě aktuální lokalizace.
  • Do modulu typing, který poskytuje prostředky pro zadávání anotací typů, byl přidán nový operator, který umožňuje použití syntaxe „X | Y“ pro výběr jednoho z typů (typ X nebo typ Y). def square(number: int | float) -> int | float: return number ** 2 je ekvivalentní dříve podporované konstrukci: def square(number: Union[int, float]) -> Union[int, float]: return number ** 2
  • Do modulu typing byl přidán operátor Concatenate a proměnná ParamSpec, které umožňují předat další informace pro statickou kontrolu typů při použití Callable. Do modulu typing byly také přidány speciální hodnoty TypeGuard pro anotaci funkcí pro ochranu typů a TypeAlias pro explicitní určení aliasu typu. StrCache: TypeAlias = 'Cache[str]' # alias typu
  • Ve funkci zip() je implementována volitelná příznak "strict", při jehož použití se provádí kontrola shodné délky iterovaných argumentů. >>> 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 delší než argument 1
  • Byly navrženy nové vestavěné funkce aiter() a anext() s implementací asynchronních analogů funkcím iter() a next().
  • Rychlost konstruktorů str(), bytes() a bytearray() byla zrychlena o 30-40 % při práci s drobnými objekty.
  • Byl snížen počet importních operací v modulu runpy. Příkaz „python3 -m jméno_modulu“ se nyní spouští v průměru 1,4krát rychleji díky zkrácení importovaných modulů z 69 na 51.
  • V instrukci LOAD_ATTR byl využit mechanismus kešování jednotlivých opkodů, což umožnilo zvýšit rychlost práce s běžnými atributy až o 36 %, a se sloty až o 44%.
  • Při sestavování Pythonu s volbou "--enable-optimizations" se nyní aktivuje režim "-fno-semantic-interposition", což ve srovnání se sestavováním s volbou "--enable-shared" zrychluje práci interpretu o až 30%.
  • V modulech hashlib a ssl byla přidána podpora OpenSSL 3.0.0 a podpora verzí OpenSSL starších než 1.1.1 byla ukončena.
  • Byl odstraněn starý parser, který byl nahrazen parserem PEG (Parsing Expression Grammar). Byl odstraněn modul formatter. Z API asyncio byl odstraněn parametr loop. Byly odstraněny metody, které byly dříve označeny jako zastaralé. Byly odstraněny funkce Py_UNICODE_str*, které manipulují s řetězci Py_UNICODE*.
  • Modul distutils byl označen jako zastaralý a má být odstraněn v Pythonu 3.12. Místo distutils se doporučuje používat moduly setuptools, packaging, platform, shutil, subprocess a sysconfig. Struktura wstr byla převedena na PyUnicodeObject a byla zařazena mezi zastaralé a plánované k odstranění.

Zdroj: opennet.ru

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster