5.8. Match Mapping
A mapping pattern looks like {"user": user, "emails": [*emails]} .
It matches mappings with at least the set of provided keys, and if all
the sub-patterns match their corresponding values. It binds whatever
the sub-patterns bind while matching with the values corresponding
to the keys. Adding **others at the end of the pattern to capture
extra items is allowed.
5.8.1. Problem
>>> user = {'firstname': 'Alice', 'lastname': 'Apricot', 'age': 30}
>>>
>>> if isinstance(user, dict) and len(user) == 3 and user.get('firstname') == 'Alice' and user.get('lastname') == 'Apricot' and user.get('age') == 30:
... pass
... elif isinstance(user, dict) and len(user) == 3 and user.get('firstname') == 'Bob' and user.get('lastname') == 'Blackthorn' and user.get('age') == 31:
... pass
... elif isinstance(user, dict) and len(user) == 3 and user.get('firstname') == 'Carol' and user.get('lastname') == 'Corn' and user.get('age') == 32:
... pass
5.8.2. Solution
>>> user = {'firstname': 'Alice', 'lastname': 'Apricot', 'age': 30}
>>>
>>> match user:
... case {'firstname': 'Alice', 'lastname': 'Apricot', 'age': 30}: pass
... case {'firstname': 'Bob', 'lastname': 'Blackthorn', 'age': 31}: pass
... case {'firstname': 'Carol', 'lastname': 'Corn', 'age': 32}: pass
5.8.3. Len
>>> user = {'firstname': 'Alice', 'lastname': 'Apricot', 'age': 30}
>>>
>>> match user:
... case {'firstname': 'Alice', 'lastname': 'Apricot'}: pass
... case {'firstname': 'Alice', 'lastname': 'Apricot', 'age': 30}: pass
... case {'firstname': 'Alice', 'lastname': 'Apricot', 'email': 'alice@example.com'}: pass
5.8.4. Wildcard
>>> user = {'firstname': 'Alice', 'lastname': 'Apricot', 'age': 30}
>>>
>>> match user:
... case {'firstname': 'Alice', 'lastname': 'Apricot', 'age': _}: pass
... case {'firstname': 'Bob', 'lastname': 'Blackthorn', 'age': _}: pass
... case {'firstname': 'Carol', 'lastname': 'Corn', 'age': _}: pass
5.8.5. Capture
>>> user = {'firstname': 'Alice', 'lastname': 'Apricot', 'age': 30}
>>>
>>> match user:
... case {'firstname': 'Alice', 'lastname': 'Apricot', 'age': age}: pass
... case {'firstname': 'Bob', 'lastname': 'Blackthorn', 'age': age}: pass
... case {'firstname': 'Carol', 'lastname': 'Corn', 'age': age}: pass
>>> user = {'firstname': 'Alice', 'lastname': 'Apricot', 'age': 30}
>>>
>>> match user:
... case {'firstname': firstname, 'lastname': lastname, 'age': 30}: pass
... case {'firstname': firstname, 'lastname': lastname, 'age': 31}: pass
... case {'firstname': firstname, 'lastname': lastname, 'age': 32}: pass
5.8.6. Unpacking
>>> user = {'firstname': 'Alice', 'lastname': 'Apricot', 'age': 30}
>>>
>>> match user:
... case {'age': 30, **name}: pass
... case {'age': 31, **name}: pass
... case {'age': 32, **name}: pass