""" Pattern matching with mapping—requires Python ≥ 3.10 # tag::DICT_MATCH_TEST[] >>> b1 = dict(api=1, author='Douglas Hofstadter', ... type='book', title='Gödel, Escher, Bach') >>> get_creators(b1) ['Douglas Hofstadter'] >>> from collections import OrderedDict >>> b2 = OrderedDict(api=2, type='book', ... title='Python in a Nutshell', ... authors='Martelli Ravenscroft Holden'.split()) >>> get_creators(b2) ['Martelli', 'Ravenscroft', 'Holden'] >>> get_creators({'type': 'book', 'pages': 770}) Traceback (most recent call last): ... ValueError: Invalid 'book' record: {'type': 'book', 'pages': 770} >>> get_creators('Spam, spam, spam') Traceback (most recent call last): ... ValueError: Invalid record: 'Spam, spam, spam' # end::DICT_MATCH_TEST[] """ # tag::DICT_MATCH[] def get_creators(record: dict) -> list: match record: case {'type': 'book', 'api': 2, 'authors': [*names]}: # <1> return names case {'type': 'book', 'api': 1, 'author': name}: # <2> return [name] case {'type': 'book'}: # <3> raise ValueError(f"Invalid 'book' record: {record!r}") case {'type': 'movie', 'director': name}: # <4> return [name] case _: # <5> raise ValueError(f'Invalid record: {record!r}') # end::DICT_MATCH[]