Python match文を利用してみた
Python3.10で導入されたmatch文を確認しました。便利そうな使い方を3種類メモしておきます。
Enumをmatchさせる。表示部分をモデルから分離して実装するときに使いたいです。
from enum import Enum
class Status(Enum):
TODO = 'todo'
INPROGRESS = 'inprogress'
DONE = 'done'
def decorate_status(s):
match s:
case Status.TODO:
print('To Do')
case Status.INPROGRESS:
print('In Progress')
case Status.DONE:
print('Done')
case _:
raise ValueError("Error!!!")
decorate_status(Status.TODO) # To Do
decorate_status(Status.INPROGRESS) # In Progress
decorate_status(Status.DONE) # Done
if文と組み合わせて条件を絞る。複雑な条件でもスッキリ書けるケースがありそうです。
def decorated_positive_point(x, y):
match (x, y):
case (x, y) if (x < 0 or y < 0):
print(f"error: x={x}, y={y}")
raise ValueError("Negative Error!!!")
case (0, 0):
print("origin")
case (x, y) if x >=0 & y >=0:
print(f"x={x}, y={y}")
decorated_positive_point(1, 3) # x=1, y=3
decorated_positive_point(0, 0) # origin
decorated_positive_point(-1, 0) # ValueError: Negative Error!!!
class毎にmatchさせる。型を活用して硬めの実装をする場合に使ってみたいです。
class IntType:
value: int
def __init__(self, value: int):
self.value = value
class StringType:
value: str
def __init__(self, value: str):
self.value = value
def decorated_value(obj):
match obj:
case IntType(value = v):
print(f"number={v}")
case StringType(value = v):
print(f"string={v}")
case _:
raise ValueError("Error!!!")
decorated_value(IntType(10)) # number=10
decorated_value(StringType("ten")) # string=ten
おしまい!
この記事が気に入ったら、サポートをしてみませんか?
気軽にクリエイターの支援と、記事のオススメができます!
気軽にクリエイターの支援と、記事のオススメができます!