Шаблони класів

Оновлено: 24.04.2023

Шаблон класу представляє клас і його позиційні та ключові аргументи (якщо такі є). Синтаксис:

class_pattern       ::=  name_or_attr "(" [pattern_arguments ","?] ")"
pattern_arguments   ::=  positional_patterns ["," keyword_patterns]
                         | keyword_patterns
positional_patterns ::=  ",".pattern+
keyword_patterns    ::=  ",".keyword_pattern+
keyword_pattern     ::=  NAME "=" pattern

Те саме ключове слово не повинно повторюватися в шаблонах класів.

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

Якщо name_or_attr не є екземпляром вбудованого type , викликати TypeError. Якщо значення теми не є екземпляром name_or_attr (перевірено через isinstance()), шаблон класу не вдається. Якщо аргументи шаблону відсутні, шаблон виконується успішно. В іншому випадку наступні кроки залежать від того, чи присутні шаблони ключових слів або позиційних аргументів. Для ряду вбудованих типів (зазначених нижче) приймається один позиційний підшаблон, який відповідатиме всьому об’єкту; для цих типів шаблони ключових слів також працюють, як і для інших типів. Якщо присутні лише шаблони ключових слів, вони обробляються таким чином, один за іншим: I. Ключове слово шукається як атрибут теми. Якщо це викликає виняток, відмінний від AttributeError, виняток з’являється. Якщо це викликає помилку AttributeError, шаблон класу стався невдало. В іншому випадку підшаблон, пов’язаний із шаблоном ключового слова, зіставляється зі значенням атрибута суб’єкта. Якщо це не вдається, шаблон класу не працює; якщо це вдається, відповідність переходить до наступного ключового слова. II. Якщо всі шаблони ключових слів успішні, шаблон класу успішний. Якщо присутні будь-які позиційні шаблони, вони перетворюються на шаблони ключових слів за допомогою атрибута __match_args__ класу name_or_attr перед відповідністю: I. Викликається еквівалент getattr(cls, "__match_args__", ()). Якщо це викликає виняток, виняток з’являється. Якщо повернуте значення не є кортежем, перетворення не вдається, і виникає TypeError. Якщо є більше позиційних шаблонів, ніж len(cls.__match_args__), виникає TypeError. В іншому випадку позиційний шаблон i перетворюється на шаблон ключового слова з використанням __match_args__[i] як ключове слово. __match_args__[i] має бути рядком; якщо ні, виникає TypeError. Якщо є повторювані ключові слова, виникає TypeError. Дивись також Налаштування позиційних аргументів у відповідності шаблону класу II. Коли всі позиційні моделі буде перетворено на ключові слова, відповідність відбувається так, якби були лише шаблони ключових слів. Для наступних вбудованих типів обробка позиційних підшаблонів відрізняється: bool bytearray bytes dict float frozenset int list set str tuple These classes accept a single positional argument, and the pattern there is matched against the whole object rather than an attribute. For example int(0|1) matches the value 0, but not the value 0.0.

Простіше кажучи, CLS(P1, attr=P2) збігається, лише якщо відбувається таке:

isinstance( , CLS) перетворити P1 на шаблон ключового слова за допомогою CLS.__match_args__ Для кожного аргументу ключового слова attr=P2: hasattr( , "attr") P2 відповідає .attr … і так далі для відповідної пари ключового слова аргумент/шаблон.