Описание тега structural-pattern-matching

Этот тег предназначен для вопросов о функции сопоставления структурных шаблонов Python, представленной в версии 3.10.
1 ответ

Как использовать сопоставление шаблонов для запросов в стиле SQL со строками JSON или JSON

Начиная с данных в виде JSON или строкJSON , я хочу использовать сопоставление структурных шаблонов для выполнения запросов к ним. Например, после запуска json.load() я получаю dict со следующей структурой: publications = { 'location': 'central libr…
1 ответ

Предотвращение случайного захвата при сопоставлении структурных шаблонов

Этот пример обсуждается как вероятная "ошибка" при использовании сопоставления с образцом: NOT_FOUND = 400 retcode = 200 match retcode: case NOT_FOUND: print('not found') print(f'Current value of {NOT_FOUND=}') Это пример случайного захвата со струк…
2 ответа

Преобразование нескольких проверок isinstance в структурное сопоставление с образцом

Я хочу преобразовать этот существующий код для использования сопоставления с образцом: if isinstance(x, int): pass elif isinstance(x, str): x = int(x) elif isinstance(x, (float, Decimal)): x = round(x) else: raise TypeError('Unsupported type') Как в…
1 ответ

Как выразить логику набора текста hasattr() со структурным сопоставлением шаблонов?

У меня есть код, который проверяет именованные кортежи и классы данных , ища _fields атрибут: if hasattr(candidate, '_fields'): do_action() Как я могу выразить это с помощью сопоставления структурных шаблонов совпадений / регистра в Python 3.10?
2 ответа

Захват делает оставшиеся шаблоны недоступными

Почему этот код не работает: OKAY = 200 NOT_FOUND = 404 INTERNAL_SERVER_ERROR = 500 match status: case OKAY: print('It worked') case NOT_FOUND: print('Unknown') case INTERNAL_SERVER_ERROR: print('Out of service') case _: print('Unknown code') Он ген…
2 ответа

Структурный образец сопоставления Python - сопоставление набора / Frozenset

Я играл со структурным шаблоном соответствия в Python 3.10 и не могу понять, как заставить его соответствовать набору. Например, я пробовал: a = {1,2,3} match a: case set(1,2,3): print('matched') и я пробовал: a = {1,2,3} match a: case set([1,2,3]):…
03 июн '21 в 23:11
1 ответ

Point() принимает 0 позиционных подшаблонов (дано 2)

Я пытаюсь запустить пример из документации, но получаю сообщение об ошибке: Traceback (most recent call last): File "<stdin>", line 2, in <module> TypeError: Point() accepts 0 positional sub-patterns (2 given) Может кто-нибудь объяснить,…
2 ответа

Использование структурного сопоставления с образцом для определения хешируемости

Как написать регистр, который соответствует хешируемым объектам, используя структурное сопоставление с образцом?
1 ответ

Как отличить кортеж от списка при сопоставлении структурных шаблонов Python?

Я хочу использовать сопоставление структурных шаблонов Python, чтобы различать кортеж (например, представляющий точку) и список кортежей. Однако простой подход не работает: def fn(p): match p: case (x, y): print(f"single point: ({x}, {y})") case [*p…
1 ответ

Можете ли вы перегрузить оператор матча?

В python есть много операторов, которые можно перегружать (например, +). Но просматривая документы для python 3.10 и PEP 622, мне было интересно, можно ли то же самое сделать для match оператор (например, для упрощения представления объекта) - или э…
2 ответа

Невозможно вычесть в случае шаблона?

Я пытаюсь использовать сопоставление структурных шаблонов Python 3.10 в оболочке Python: match a: case (2 - 1): после ввода второй строки выдает следующую ошибку: File "<stdin>", line 2 case (2 - 1): ^ SyntaxError: imaginary number required in…
1 ответ

Сопоставление с образцом для проверки протокола. Получение TypeError: вызываемый шаблон соответствия должен быть типом

Мне нужно сопоставить случаи, когда ввод является итерируемым . Вот что я пробовал: from typing import Iterable def detector(x: Iterable | int | float | None) -> bool: match x: case Iterable(): print('Iterable') return True case _: print('Non ite…
1 ответ

Безопасное индексирование с сопоставлением с образцом в Python

У меня есть огромный список слов corpusи конкретное слово. Я знаю индекс каждого появления в корпусе. я хочу посмотреть на nразмер окна вокруг каждого случая wи создайте словарь других слов, встречающихся в этом окне. Словарь представляет собой отоб…
1 ответ

Сопоставление элемента в неизвестном месте последовательности с использованием сопоставления структурных шаблонов в Python 3.10

Есть ли какой-нибудь умный способ сопоставить элемент в неизвестном месте в последовательности неизвестной длины, используя сопоставление структурных шаблонов в Python 3.10? Ниже приведен нерабочий пример, иллюстрирующий то, что я хотел бы сделать. …
22 фев '22 в 21:25
1 ответ

Шаблон класса соответствует неправильным случаям

Я пишу сериализатор объектов, но у меня возникают проблемы, когда шаблоны классов не соответствуют ожидаемым случаям: def dump_obj(x): match(x): case list(): emit('L') dump_obj(len(x)) for elem in x: dump_obj(elem) case Iterable(): emit('I') dump_ob…
0 ответов

сопоставление структурного шаблона: сопоставьте объект типа с определенным классом

Я хотел бы написать блок сопоставления с образцом, который определяет, является ли сопоставляемый объект typeобъект /class, например, или . Не их экземпляр , а фактический объект класса или . Это : x = int match x: case str: print("x is str") case i…
16 фев '22 в 17:06
5 ответов

Сопоставление структурных шаблонов с использованием регулярных выражений

У меня есть строка, которую я пытаюсь проверить на соответствие нескольким шаблонам регулярных выражений, и я надеялся, что, поскольку сопоставление шаблонов доступно в версии 3.10, я мог бы использовать это вместо создания блока if-else. Рассмотрим…
3 ответа

Как использовать сопоставление структурных шаблонов Python для тестирования встроенных типов?

Я пытаюсь использовать SPM, чтобы определить, является ли определенный тип intили str. Следующий код: from typing import Type def main(type_to_match: Type): match type_to_match: case str(): print("This is a String") case int(): print("This is an Int…
1 ответ

Путаница между использованием `|` для объединения двух словарей и в случае совпадения

мы знаем, что он используется для объединения двух словарей, например, dct_1 = {'a': 1} dct_2 = {'b': 2} print(dct_1 | dct_2) дает, {'a': 1, 'b': 2} но если кто-то хочет использовать одно и то же в match-case для объединения двух словарей, x = {'a':…
0 ответов

Сопоставление структурных шаблонов в python <3.10

Чтобы использовать | оператор в <3.10, можно сделать from __future__ import annotations. Возможно ли что-то подобное для сопоставления структурных шаблонов, т.е. написание таких вещей, как match x: case 1: print("x is 1") case 2: print("x is 2")