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

5.8.7. Assignments