Шаблони послідовності

Оновлено: 24.04.2023

Шаблон послідовності містить кілька підшаблонів, які потрібно зіставити з елементами послідовності. Синтаксис подібний до розпакування списку або кортежу.

sequence_pattern       ::=  "[" [maybe_sequence_pattern] "]"
                            | "(" [open_sequence_pattern] ")"
open_sequence_pattern  ::=  maybe_star_pattern "," [maybe_sequence_pattern]
maybe_sequence_pattern ::=  ",".maybe_star_pattern+ ","?
maybe_star_pattern     ::=  star_pattern | pattern
star_pattern           ::=  "*" (capture_pattern | wildcard_pattern)

Немає різниці, якщо дужки або квадратні дужки використовуються для шаблонів послідовності (тобто (...) проти [...] ).

Щонайбільше один зірковий підшаблон може бути в шаблоні послідовності. Підшаблон зірки може з’являтися в будь-якій позиції. Якщо підшаблон зірки відсутній, шаблон послідовності є шаблоном послідовності фіксованої довжини; інакше це шаблон послідовності змінної довжини.

Нижче наведено логічний потік для зіставлення шаблону послідовності зі значенням предмета:

Якщо значення теми не є послідовністю 2, шаблон послідовності не виконується. Якщо значення теми є екземпляром str, bytes або bytearray, шаблон послідовності не виконується. Подальші кроки залежать від того, чи є шаблон послідовності фіксованою чи змінною довжиною. Якщо шаблон послідовності має фіксовану довжину: Якщо довжина предметної послідовності не дорівнює кількості підшаблонів, шаблон послідовності не вдається Підшаблони в шаблоні послідовності зіставляються з відповідними елементами в послідовності предметів зліва направо. Зіставлення припиняється, як тільки підшаблон не вдається. Якщо всі підшаблони успішно відповідають їхньому відповідному елементу, шаблон послідовності вдається. В іншому випадку, якщо шаблон послідовності має змінну довжину: Якщо довжина предметної послідовності менша за кількість незіркових підшаблонів, шаблон послідовності не вдається. Провідні незіркові підшаблони зіставляються з відповідними елементами, як для послідовностей фіксованої довжини. Якщо попередній крок виконано успішно, підшаблон зірочки збігається зі списком, сформованим із решти предметних елементів, за винятком решти елементів, що відповідають підшаблонам без зірочки, які слідують за підшаблоном зірочки. Решта підшаблонів без зірок зіставляються з відповідними предметними елементами, як для послідовності фіксованої довжини. Примітка Довжина предметної послідовності визначається через len() (тобто через __len__() протокол). Ця довжина може бути кешована інтерпретатором подібним чином, як шаблони значень.

Простіше кажучи, [P1, P2, P3, … , P ] збігається, лише якщо відбувається все наступне:

перевірка є послідовністю len(subject) == P1 відповідає [0] (зауважте, що цей збіг також може пов’язувати імена) P2 відповідає [1] (зауважте, що цей збіг також може пов’язувати імена) … і так далі для відповідного шаблону/елемента.