【要約】Python の `Protocol` 入門 — ダックタイピングに型を付ける [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
Python開発者は、ダックタイピングの柔軟性を維持しつつ、実行時のエラーを防ぎたいという課題に直面する。具体的には、以下の問題が発生する。
- ・型ヒントがないため、メソッドの不整合を事前に検知できない。
- ・通常の継承を用いると、既存クラスに親クラスの継承を強制することになる。
- ・外部ライブラリのクラスに対して、後付けで型を適用することが困難である。
// Approach
開発者は、typing.Protocolを用いた構造的部分型付けを採用し、以下の手順で型安全性を確保する。
- ・typing.Protocolを継承したクラスで、必要なメソッドの形を定義する。
- ・具体的な実装クラスは、Protocolを継承せずにメソッドのみを実装する。
- ・mypyやpyright等の型検査ツールを用い、実行前に型不整合を検出する。
- ・@runtime_checkableを使い、必要に応じて実行時の型検査を行う。
// Result
この手法の導入により、開発者は実装の詳細に依存せず、以下の成果を得られる。
- ・AttributeErrorなどの実行時エラーを、開発段階で未然に防げる。
- ・既存のクラスや外部ライブラリを、書き換えることなく型安全に扱える。
- ・通知処理の差し替えなど、疎結合な設計を容易に実現できる。
Senior Engineer Insight
> 依存性の注入(DI)において、Protocolは極めて強力な武器となる。従来のABCは継承を強いるため、結合度を高めがちであった。Protocolは「振る舞い」のみを定義するため、既存コードへの非侵襲的な型付与が可能だ。これにより、開発体験と保守性を同時に向上させられる。ただし、実行時のisinstanceではシグネチャの検証が不完全である点に注意せよ。