Python 3.10+astпонятие
ast.MatchClass
сопоставление с образцом
Образец класса case Point(x, y=0): cls — имя класса, patterns — позиционные образцы, kwd_attrs и kwd_patterns — именованные.
Синтаксис
ast.MatchClass(cls, patterns, kwd_attrs, kwd_patterns)
Выглядит как вызов, но конструктор не вызывается: проверяется isinstance, затем атрибуты. Позиционные образцы работают только при __match_args__ у класса (dataclass задаёт его сам), иначе — TypeError при сопоставлении. kwd_attrs — список строк, а не узлов. 'case int(n)' у встроенных типов захватывает сам объект.
Примеры
import ast
p = ast.parse('match o:\n case Point(x, y=0): pass').body[0].cases[0].pattern
print(type(p).__name__, p.cls.id, len(p.patterns), p.kwd_attrs) # → MatchClass Point 1 ['y']
class P:
def __init__(self, x):
self.x = x
try:
match P(1):
case P(v):
pass
except TypeError as e:
print(type(e).__name__) # → TypeError
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности