example-code-2e/05-data-classes/match_cities.py
2021-07-07 23:45:54 -03:00

93 lines
1.8 KiB
Python

"""
match_cities.py
"""
# tag::CITY[]
import typing
class City(typing.NamedTuple):
continent: str
name: str
country: str
cities = [
City('Asia', 'Tokyo', 'JP'),
City('Asia', 'Delhi', 'IN'),
City('North America', 'Mexico City', 'MX'),
City('North America', 'New York', 'US'),
City('South America', 'São Paulo', 'BR'),
]
# end::CITY[]
# tag::ASIA[]
def match_asian_cities():
results = []
for city in cities:
match city:
case City(continent='Asia'):
results.append(city)
return results
# end::ASIA[]
# tag::ASIA_POSITIONAL[]
def match_asian_cities_pos():
results = []
for city in cities:
match city:
case City('Asia'):
results.append(city)
return results
# end::ASIA_POSITIONAL[]
# tag::ASIA_COUNTRIES[]
def match_asian_countries():
results = []
for city in cities:
match city:
case City(continent='Asia', country=cc):
results.append(cc)
return results
# end::ASIA_COUNTRIES[]
# tag::ASIA_COUNTRIES_POSITIONAL[]
def match_asian_countries_pos():
results = []
for city in cities:
match city:
case City('Asia', _, country):
results.append(country)
return results
# end::ASIA_COUNTRIES_POSITIONAL[]
def match_india():
results = []
for city in cities:
match city:
case City(_, name, 'IN'):
results.append(name)
return results
def match_brazil():
results = []
for city in cities:
match city:
case City(country='BR', name=name):
results.append(name)
return results
def main():
tests = ((n, f) for n, f in globals().items() if n.startswith('match_'))
for name, func in tests:
print(f'{name:15}\t{func()}')
if __name__ == '__main__':
main()