Как использовать сопоставление шаблонов для запросов в стиле 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