使用`**`在字典上进行结构模式匹配

问题描述 投票:0回答:2

这有什么道理吗?

dct = {'a': 1, 'b': 2}
dct_1 = {'a': 1}
dct_2 = {'b': 2}
match dct:
  case {'b': 2, **dct_1}: print("using {'b': 2, **dct_1}", dct)

输出,

using {'b': 2, **dct_1} {'a': 1, 'b': 2}

但是,

match dct:
  case {**dct_1, 'b': 2}: print("using {**dct_1, 'b': 2}", dct)

给出错误,

    case {**dct_1, 'b': 2}: print("using {**dct_1, 'b': 2}", dct)
                   ^^^
SyntaxError: invalid syntax

并且,

match dct:
  case {**dct_1, **dct_2}: print("using {**dct_1, **dct_2))}", dct)

给出错误,

    case {**dct_1, **dct_2}: print("using {**dct_1, **dct_2))}", dct)
                   ^^
SyntaxError: invalid syntax
python pattern-matching
2个回答
2
投票

这就是映射模式的语法的定义方式。

映射图案中最多可以有一个双星图案。双星图案必须是映射图案中的最后一个子图案。

如果有多个双星模式,则哪些项目应该与哪些模式匹配将是不明确的。我怀疑在不首先匹配显式模式的情况下决定非最终双星模式应该匹配哪些项目太麻烦了,所以它是不允许的。请注意,映射模式不是表达式,因此不需要像字典显示那样支持那么多的灵活性。


0
投票

匹配语句无法按您期望的方式工作。

Python

match
语句与模式匹配,而不是值(尽管文字和 dotted 标识符是有效模式)。任何非点标识符都被视为捕获模式

例如:

match {'a': 1, 'b': 2}:
    case {'a': a, **rest}: print(a, rest)

输出

1 {'b': 2}

回到你的代码,

case {'b': 2, **dct_1}:
不会展开
dct_1
;它将剩余的键绑定
dct_1

我建议阅读 PEP 以获取更多详细信息和示例。

© www.soinside.com 2019 - 2024. All rights reserved.