问题描述
从 JSON 或 JSON lines 形式的数据开始,我想使用 structural pattern matching 对其运行查询。
例如,在运行 json.load() 后,我得到一个结构如下的字典:
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'},'title': 'Weekly climber','issues': 42},]
}
我想要做的是应用 Python 3.10 的结构模式匹配提取相关数据很多 like 我会用这个 sql 查询:
SELECT title,issues FROM Publications WHERE kind = "magazine";
解决方法
映射模式
解决方案的关键是应用mapping patterns。根据 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')
这会过滤项目以仅包含杂志。然后它提取 title 和 issues 字段。这输出:
Flying Monthly has 15 issues on hand
Weekly Climber has 42 issues on hand