0xf

日記だよ

pythonの型によるパターンマッチ

普通に match でいけるようになってた。便利。

import fire
from typing import Union, Tuple

def try_parse(value) -> Union[float, str]:
    try:
        return float(value)
    except (ValueError, TypeError):
        return str(value)
        
def parse_input(a, b) -> Tuple[Union[float, str], Union[float, str]]:
    return try_parse(a), try_parse(b)


def add(a, b) -> None:
    parsed_values = parse_input(a, b)
    
    match parsed_values:
        case (float(num_a), float(num_b)):
            print(f"{num_a} + {num_b} = {num_a + num_b}")
        case _:
            print("数値を入力してください")


if __name__ == "__main__":
    fire.Fire(add) 

カスタム型でも部分マッチいけるじゃん。

class User:
    def __init__(self, name: str, age: int):
        self.name = name
        self.age = age    

data = [ User("John", 20), 1, User("Jane", 21), User("Jim", 22) ]

def main() -> None:
    for item in data:
        match item:
            case User(name=name, age=age):
                print(name, age)
            case _:
                print("???")

if __name__ == "__main__":
    main()

だいぶスマートになった。nameがJohnのやつだけマッチさせるとかも普通にできる。case User(name=name, age=age) if age > 18: とか case User(name="Tom", age=age)とかいける。

結構前から使えていたらしい。 : Pythonの構造的パターンマッチングのさらに便利なパターン紹介 | gihyo.jp