Co je nového v Pythonu 3.9

Od Petr Zemek, 2020-10-09

Na začátku října byl vydán Python 3.9. V článku bych chtěl popsat vybrané novinky, které mě zaujaly.

Oficiální shrnutí změn je zde. Úplný seznam pak lze nalézt v changelogu. V textu níže předpokládám znalost předchozích verzí Pythonu.

Nové operátory pro spojování a aktualizaci slovníků

Do vestavěné třídy dict byly přidány operátory na spojování (angl. merge) a aktualizaci (angl. update) slovníků. Mějme následující slovníky:

d1 = {'a': 1, 'b': 1}
d2 = {'b': 2, 'c': 2}

Místo

d = d1.copy()
d.update(d2)

což potřebuje dočasnou proměnnou, nebo

d = {**d1, **d2}

což není příliš čitelné, lze nyní psát

d = d1 | d2
print(d) # {'a': 1, 'b': 2, 'c': 2}

Pokud bychom chtěli první slovník aktualizovat obsahem druhého, tak lze nově napsat

d1 |= d2
print(d1) # {'a': 1, 'b': 2, 'c': 2}

Detaily: PEP-584

Nové řetězcové metody pro odstranění prefixu a suffixu

Do str, bytes a dalších typů přibyly dvě nové metody:

print('Hey there'.removeprefix('Hey ')) # there
print('Hey there'.removesuffix(' there')) # Hey

Detaily: PEP-616

Zjednodušení typových anotací

V typových anotacích lze nyní používat vestavěné typy místo typů z typing modulu. Např. místo

import typing
 
def concatenate(strings: typing.List[str]) -> str:
    ...

lze nyní napsat

def concatenate(strings: list[str]) -> str:
    ...

Detaily: PEP-585

Flexibilní typové anotace

Byla přidána možnost doplňování typových anotací o libovolná metadata s využitím typing.Annotated typu. Příklad níže ukazuje použití pro vytvoření typu UnsignedShort, který je z pohledu Pythonu aliasem pro int, ale nástroje či skripty mohou pro serializaci použít dodatečnou informaci o znaménkovosti a bitové šířce:

import typing
 
UnsignedShort = typing.Annotated[int, ('u', 16)]

Samozřejmě takový nástroj či skript musí existovat :-). Příklad, založený na této ukázce, je čistě smyšlený.

Detaily: PEP 593

Nový modul: zoneinfo

Nový modul zoneinfo přidává implementaci časových zón do Pythoní standardní knihovny. Dříve k tomu bylo potřeba na všech platformách používat balíček tzdata. Nyní se buď použije databáze časových zón ze systému, nebo tzdata (pokud systém databázi časových zón neobsahuje). Každopádně, v případě, že vyvíjíte multiplatformní projekt, tak je doporučeno přidat závislost na tzdata. Jinak může nastat to, že vám zoneinfo modul bude vyhazovat výjimku ZoneInfoNotFoundError.

Ukázka:

import datetime
import zoneinfo
 
dt = datetime.datetime(2020, 10, 10, tzinfo=zoneinfo.ZoneInfo('Europe/London'))
print(dt) # 2020-10-10 00:00:00+01:00
dt = datetime.datetime(2020, 10, 10, tzinfo=zoneinfo.ZoneInfo('Europe/Prague'))
print(dt) # 2020-10-10 00:00:00+02:00

Detaily: PEP-615

Nový modul: graphlib

Druhým novým standardním modulem je graphlib. Jeho účelem je obsahovat operace nad grafovými datovými strukturami. Aktuálně obsahuje jedinou třídu TopologicalSorter implementující toplogické uspořádání grafu.

Ukázka:

import graphlib
 
#
#           C --> F
#           ^      \
#          / \      v
#   A --> B   D --> G
#          \ /
#           v
#           E
#
graph = {
    'A': [],
    'B': ['A'],
    'C': ['B', 'D'],
    'D': [],
    'E': ['B', 'D'],
    'F': ['C'],
    'G': ['D', 'F'],
}
ts = graphlib.TopologicalSorter(graph)
print(list(ts.static_order())) # ['A', 'D', 'B', 'C', 'E', 'F', 'G']

Detaily: bpo-17005

Dekorátorem nyní může být libovolný výraz

Drobná změna v gramatice, která umožní, aby dekorátorem mohl být libovolný výraz. Lze tedy např. mít pole dekorátorů a použít z něj konkrétní dekorátor:

@decorators[0]
def foo():
    ...

Předchozí verze Pythonu na takovémto kódu vyhazovaly SyntaxError, protože vyžadovaly, aby dekorátor obsahoval pouze identifikátory, tečky, a případně volání funkce na jeho konci.

Detaily: PEP 614

Nový parser

CPython (standardní implementace Pythonu v Céčku) obsahuje nový parser založený na PEG gramatikách místo na LL(1) gramatikách. Rychlostně to v CPythonu vychází přibližně na stejno. Nicméně PEG gramatiky jsou flexibilnější s ohledem na vývoj nových jazykových vlastnostní. Na to si však budeme muset počkat do některé z dalších verzí Pythonu :-).

Detaily: PEP-617

Nový vývojový cyklus Pythonu

Když už se bavíme o nových verzích Pythonu, tak došlo ke změně cyklu vývoje Pythonu. Od Pythonu 3.9 budou nové hlavní verze vycházet co 12 měsíců, tedy každý říjen.

Detaily: PEP-602

Ostatní změny

Kromě novinek výše je v Pythonu 3.9 samozřejmě mnoho dalších změn. Níže jsem sepsal odkazy na oficiální dokumentaci. Kdo budete mít zájem, tak na odkazy mrkněte.

Zdrojové kódy

Všechny zdrojové kódy jsou k dispozici u mě na GitHubu, takže si vše můžete vyzkoušet.

Obsah tohoto pole je soukromý a nebude veřejně zobrazen.

Filtrované HTML (využíváno)

  • Povolené HTML značky: <a href hreflang> <em> <strong> <cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <table>
  • Zvýraznění syntaxe kódu lze povolit přes následující značky: <code>, <blockcode>, <bash>, <c>, <cpp>, <haskell>, <html>, <java>, <javascript>, <latex>, <perl>, <php>, <python>, <ruby>, <rust>, <sql>, <text>, <vim>, <xml>, <yaml>.
  • Řádky a odstavce se zalomí automaticky.
  • Webové a e-mailové adresy jsou automaticky převedeny na odkazy.
CAPTCHA
10 + 5 =
Vyřešte tento jednoduchý matematický příklad a vložte výsledek. Např. pro 1+3 vložte 4.
Nějak se mi tady rozmohl spam, takže poprosím o ověření.