5.11. Match Subpattern

5.11.1. Problem

>>> user = ('Alice', 'Apricot', 30)
>>>
>>> if user[0] in ('Alice', 'Bob', 'Carol'):
...     lastname = user[1]
...     pass
... elif user[0] in ('Dave', 'Eve', 'Mallory'):
...     lastname = user[1]
...     pass

5.11.2. Solution

>>> user = ('Alice', 'Apricot', 30)
>>>
>>> match user:
...     case [('Alice'|'Bob'|'Carol'), lastname, _]: pass
...     case [('Dave'|'Eve'|'Mallory'), lastname, _]: pass

5.11.3. Capture

>>> user = ('Alice', 'Apricot', 30)
>>>
>>> match user:
...     case [('Alice'|'Bob'|'Carol') as firstname, lastname, _]: pass
...     case [('Dave'|'Eve'|'Mallory') as firstname, lastname, _]: pass

5.11.4. Use Case - 1

  • Game Controller

Test Setup:

>>> class Hero:
...     def move_horizontal(self, direction, value): ...
...     def move_vertical(self, direction, value): ...
>>>
>>> hero = Hero()

Use Case:

>>> action = ['move', 'left', 10]
>>>
>>> match action:
...
...     case ['move', ('up'|'down') as direction, value]:
...         hero.move_vertical(direction, value)
...
...     case ['move', ('left'|'right') as direction, value]:
...         hero.move_horizontal(direction, value)
...
...     case _:
...         raise ValueError('Invalid direction')

5.11.5. Assignments