77 – Match an exact dictionary structure#
Structural pattern matching can be used to match dictionaries with given keys and values.
By default, patterns with dictionaries only determine keys and values that a dictionary must contain to match. This means dictionaries can have more keys/values than the ones listed, and they still match.
If you wish to match a specific, restricted dictionary structure (that is, if you want to disallow dictionaries from having more key/value pairs), you can use a guard.
For example, consider the following match statement:
match d:
case {"name": str()}:
print("match!")
The two dictionaries below would match, even though the second one has a key "age" that is not mentioned in the pattern above.
{"name": "John"} # matches
{"name": "John", "age": 42} # matches
To only match dictionaries that have exactly that structure, introduce a guard with **kwargs that asserts that there are no extra keys:
match d:
case {"name": str(), **kwargs} if not kwargs:
print("match!")
With this guard, the longer dictionary will not match.
Further reading: