Just for discussion (I’m new to Python by the way). I saw an example for pattern matching with Class in Fluent Python (2nd Edition):
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'),
]
def match_brazil():
results = []
for city in cities:
match city:
case City(country='BR', name=name):
results.append(name)
return results
It uses 5 lines of code to filter the items in the list (actually, it is filter
and map
; or flatMap
in functional programming).
results = []
for city in cities:
match city:
case City(country='BR', name=name):
results.append(name)
Is that possible use match case
within list comprehension in current Python version? like this:
# When using `for ... in ... if ...` for current Python, you need lots of code after `if`.
results = [city.name for city in cities if (type(city) == City) and (city.country == 'BR')]
# Use `match case` instead of `if` in the list comprehension
results = [name for city in cities match case City(country='BR', name=name)]
# To minimize the code, you don't need `case` here (just `match` keyword is enough)
results = [name for city in cities match City(country='BR', name=name)]
# You can omit the `city` because you don't need it in this example (use `for _ in` or `for in`).
results = [name for _ in cities match City(country='BR', name=name)]
results = [name for in cities match City(country='BR', name=name)]
This would increase the readability and coding speed when you have lots logic to check. Maybe it also has chances to increase performance.
The syntax is more like SQL.
# final version (proposal)
def match_brazil():
return [name for in cities match City(country='BR', name=name)]
That’s my proposal: for in match
within list comprehension
PS. since match
is not keyword in Python, it may need a colon after match
# from this
[name for in cities match City(country='BR', name=name)]
# to this
[name for in cities match: City(country='BR', name=name)]