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.
- Vylepšení ve standardních modulech - Hodí se alespoň proběhnout, zda tam pro vás není něco zajímavého s ohledem na moduly, které používáte.
- Optimalizace
- Co bylo zavrženo (angl. deprecated) - V souvislosti s tím se hodí zkontrolovat deprecation varování ve vašem kódu.
- Co bylo z Pythonu odstraněno
- Na co si dát pozor při přechodu na Python 3.9 - Např. z hlediska změn v API.
- Změny v C API
- Změny v build systému
Zdrojové kódy
Všechny zdrojové kódy jsou k dispozici u mě na GitHubu, takže si vše můžete vyzkoušet.