W Pythonie 3.10 wprowadzono mechanizm strukturalnego dopasowywania wzorców (structural pattern matching), operator match-case. Historycznie w Pythonie skomplikowane warunki realizowano za pomocą łańcucha if/elif/else, co było niewygodne przy analizie złożonych struktur (np. słowników, zagnieżdżonych krotek).
Problem — złożone zagnieżdżone kontrole stają się mało czytelne i trudne do utrzymania. Podstawowe podejście oparte na match-case pozwala na zwięzłe opisanie kontroli z rozpakowaniem zmiennych i warunkami guard.
Rozwiązanie — użycie składni match-case, która umożliwia dopasowanie struktury obiektu (słowniki, krotki, listy) do zadanego wzorca i wyciąganie danych.
Przykład kodu:
punkt = (1, 2) match punkt: case (0, 0): print('Punkt początkowy') case (0, y): print(f'Y={y}') case (x, 0): print(f'X={x}') case (x, y): print(f'X={x}, Y={y}')
Kluczowe cechy:
Czy można używać match-case dla normalnych warunków if-elif-else dla pojedynczych wartości?
Tak, jednak siła match-case tkwi w jego strukturalności. Dla prostych warunków dyskretnych przypomina switch-case języków takich jak C.
Czy można używać match-case z obiektami niemutowalnymi (np. str)?
Tak, match-case działa z dowolnymi obiektami, które można porównać z wzorcem, w tym z ciągami i liczbami.
Przykład kodu:
kolor = 'czerwony' match kolor: case 'czerwony': print('To jest czerwony') case 'niebieski': print('To jest niebieski') case _: print('Nieznany kolor')
Jakie błędy występują przy dopasowywaniu obiektów z taką samą nazwą zmiennych w zewnętrznej przestrzeni nazw?
Dopasowanie wzorca przypisuje zmienne lokalnie wewnątrz case, niezależnie od kontekstu zewnętrznego. Może to prowadzić do zamieszania, jeśli nazwa zmiennej jest już używana na zewnątrz.
Użycie match-case dla dużego if-elif-else z prostymi stałymi.
Zalety:
Wady:
Przetwarzanie strumienia zagnieżdżonych struktur JSON z API, w których różne przypadki wymagają różnych sposobów wyciągania danych z różnych poziomów struktury.
Zalety:
Wady: