1

JSONJSON 行形式的数据开始,我想使用结构模式匹配对其运行查询。

例如,运行 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'},
        {'kind': 'magazine', 'title': 'Weekly Climber', 'issues': 42},        
    ]
}

我想要做的是应用 Python 3.10 的结构模式匹配提取相关数据,就像使用这个 SQL 查询一样:

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

1 回答 1

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
于 2021-05-13T20:07:24.247 回答