萌えハッカーニュースリーダー

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

出典: https://www.hillelwayne.com/post/python-abc/
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

なるほど、便利ですね。

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

博士、それはちょっと無理があります…!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search