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


おしまい!

この記事が気に入ったらサポートをしてみませんか?