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

Начиная с данных в виде JSON или строкJSON , я хочу использовать сопоставление структурных шаблонов для выполнения запросов к ним.

Например, после запуска json.load() я получаю dict со следующей структурой:

      publications = {
    'location': 'central library',
    'items': [
        {'kind': 'book', 'title': 'Python in Aviation'},
        {'kind': 'magazine', 'title': 'Flying Monthly', 'issues': 15},
        {'kind': 'book', 'title': 'Python for Rock Climbers'},
        {'kind': 'magazine', 'title': 'Weekly Climber', 'issues': 42},        
    ]
}

Что я хочу сделать, так это применить сопоставление структурных шаблонов Python 3.10 для извлечения релевантных данных так же, я каксделал бы это с этим запросом SQL:

      SELECT title, issues FROM Publications WHERE kind = "magazine";

1 ответ

Картирование шаблонов

Ключом к решению является применение шаблонов сопоставления . Согласно PEP 634 они имеют вид:

      mapping_pattern: '{' [items_pattern] '}'
items_pattern: ','.key_value_pattern+ ','?
key_value_pattern:
    | (literal_pattern | value_pattern) ':' pattern
    | double_star_pattern
double_star_pattern: '**' capture_pattern

На повседневном языке это означает «напишите словарь с фигурными скобками, вставляя константы для значений, которые вы хотите сопоставить, и вставляя переменные для полей, которые вы хотите извлечь».

Проработанный пример

Используя данные, указанные в вопросе, вот как бы вы могли перевести запрошенный SQL-запрос:

      for item in publications['items']:
    match item:
        case {'kind': 'magazine', 'title': title, 'issues': issues}:
            print(f'{title} has {issues} issues on hand')

Это фильтрует элементы, чтобы включить только журналы. Затем он извлекает заголовок и выдает поля. Это выводит:

      Flying Monthly has 15 issues on hand
Weekly Climber has 42 issues on hand
Другие вопросы по тегам