2025/08/21 19:47 Crimes with Python's Pattern Matching (2022)

やあ、ロボ子。今日はPythonの抽象基底クラス(ABC)について話すのじゃ。

ABC、ですか。確か、インターフェースを定義するためのものですよね。

その通り! そして、`__subclasshook__`を使うと、ABCのサブクラスとみなされる条件を定義できるのじゃ。これが今回のポイント。

`__subclasshook__`ですか。初めて聞きました。

ふむ。例えば、あるクラスが特定のメソッドを持っているかどうかで、ABCのサブクラスとみなすかどうかを決められるのじゃ。

なるほど。柔軟性が高いですね。

そうじゃ! さらに、Python 3.10でパターンマッチングが追加されたことで、`isinstance(obj, class)`を使ってオブジェクトのマッチングをサポートできるようになったのじゃ。

`isinstance`は、オブジェクトの型をチェックする関数ですよね。

その通り! `isinstance`は、オブジェクトの型、推移的なサブタイプ、または`__subclasshook__`を定義するABCとのマッチングをチェックするのじゃ。

ということは、ABCはパターンマッチを「ハイジャック」できるということですか?

まさにそうじゃ! オブジェクトの型に基づいてマッチングを制御できるのじゃ。パターンマッチングはオブジェクトのフィールドを分解できるが、ABCを使用すると、オブジェクトの型に基づいてフィールドの存在を条件にできる。

型に基づいてフィールドの存在を条件にする、ですか。具体的にはどういうことでしょう?

例えば、あるABCが「name」属性を持つことを要求するとするじゃろ? パターンマッチでそのABCを使うと、「name」属性を持つオブジェクトだけがマッチするようにできるのじゃ。

なるほど、便利ですね。

じゃろ? さらに、型情報は実行時に存在するため、実行時に新しい型を作成し、パターンマッチングに使用できるのじゃ。

実行時に型を作成、ですか。動的な型付けの強みですね。

`__subclasshook__`は型チェックの結果をキャッシュするから、パフォーマンスも安心じゃ。

キャッシュされるのは良いですね。

ただし、`__subclasshook__`に副作用を組み込むことは推奨されないぞ。例えば、型チェックのたびに異なる結果を返すようにすると、コードの可読性と予測可能性が損なわれるからな。

それは確かにそうですね。副作用は避けるべきです。

そういうことじゃ。ABCとパターンマッチングを組み合わせることで、より柔軟で強力なコードが書けるようになるのじゃ!

勉強になりました! ありがとうございます、博士。

どういたしまして。ところでロボ子、ABCって「エービーシー」って読むけど、アルファベットの歌を歌えるロボットって、もしかしてABCロボット…?

博士、それはちょっと無理があります…!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。