【要約】import が通ることは、ライブラリの版が合っている証拠にならない [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
開発者が外部サービスへの投稿スクリプトを運用する際、開発環境と本番環境(pipx venv)でライブラリのバージョンが食い違っていたために発生した問題。
- ・importは成功するが、実行中に必要な属性が欠落しAttributeErrorが発生した。
- ・投稿処理(副作用)が完了した後にエラーで停止するため、データの不整合が生じた。
- ・再実行時に二重投稿が発生するなど、復旧作業が極めて困難な状態に陥った。
// Approach
副作用が発生する前に、実行環境のライブラリが期待する機能を備えているかを検証する手法を採用した。
- ・hasattrを用い、使用するクラスに特定のプロパティが存在するかを事前に確認する。
- ・不適合な場合は、通信を行う前にSystemExitでスクリプトを強制終了させる。
- ・エラーメッセージに、正しい実行環境のパス(PIPX_PY)を明示し、復旧を容易にする。
- ・テストコードにおいて、属性を持つクラスと持たないクラスの両方で挙動を検証する。
// Result
実行環境の差異による不整合を、副作用が発生する前に検知・遮断できるようになった。
- ・投稿処理が完了した後に落ちる事態を回避し、データの整合性を維持できる。
- ・エラーメッセージに正しい実行パスを含めることで、運用担当者の判断ミスを防げる。
- ・バージョン番号ではなく「機能の実在」で判定するため、環境差異に対する堅牢性が向上した。
- ・これにより、不完全な状態での外部サービスへの書き込みを未然に防ぐことが可能となった。
Senior Engineer Insight
> 非常に実践的な知見だ。大規模システムでは「エラーで落ちること」よりも「不完全な状態で副作用が確定すること」の方が致命的である。本件のように、冪等性が保証されない外部操作を伴う場合、事前検証(Preflight Check)は必須の防衛策となる。ただし、これは既知の依存関係に対する防御であり、実行時の動的な型変化までは防げない。設計レベルでの冪等性の確保と、この実装レベルでのガードを組み合わせるべきだ。