普通に 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