こんにちは。すでに投稿されてから2年経過しておりますが、、、
私もPydanticは重宝しており、こちらの投稿を見つけたので是非意見交換させてください。
私の結論としては、記載なさっているメリットを享受できるのでPythonを扱うのであれば必修・必須のライブラリだと考えています。
メリット
バリデーションによって、データの仕様に基づくデータのみを扱うことになる(堅牢性の向上)
実行時に型チェックを強制する点がPydanticの大きなメリットの1つですよね。
TypeHint単体の場合、実行時には強制力がないのでmypyなどの静的解析ツールを使わない限りType違いのエラーを防ぐことはできないですが、一方でPydanticは定義された型に合わないデータが渡された場合に実行時にエラーを発生させてくれるので、この点でデータの堅牢性が大幅に向上すると思います。
◯◯な目的で利用されているプログラミングには向いている(利用しない理由がない)
FastAPIはPydanticを利用してバリデーションモデルを作る指針なので使わない理由はないかと。
また、pydanticには他にも以下のようなメリットがあると思います。
- 高い拡張性
- デフォルト値の設定やDecoratorでカスタムバリデータの設定もサポートしているので複雑なバリデーションロジックにも容易に対応できると思います。
- 詳細なエラーメッセージによる保守性の向上
- ご存知だと思いますが、Pydanticのエラーメッセージは非常にわかりやすいです。これによってエラーの発生箇所を迅速に特定できるので保守性が向上すると思います。加えて、開発者が詳細なエラーメッセージを定義する必要がなくなるので開発効率が上がる点もメリットかと思います。
デメリット
・◯◯の用途で利用されているプログラミングには向かない
・パフォーマンスに影響がある?
どれだけ?
dataclassとPydantic(ver1)の処理速度を比較すると、Pydanticのほうが約18倍遅いようです。
ただし、PydanticのVer2はRustで書き直されたのでVer1と比較すると大幅にパフォーマンスが向上しているようです。
とはいえ、オーバーヘッドが発生するのは間違いないので極端に高いパフォーマンスが求められるシステム(高頻度のデータストリーミングサービスとか、オンラインゲームのリアルタイム処理などが考えられます)では不向きかもしれません。
なので、堅牢性を犠牲にしてまでもパフォーマンスを重視する場合は、NamedTupleやDataclassを使って最低限TypeHint を組み合わせる感じになりそうですね。
あとは、PoCなどの実験的な開発では型の制約が負担になると思うので向かないかもしれません。
導入に壁がある?
どのような?
1つにPydanticの学習コストがありますが、Pydanticは非常にわかりやすいAPIを提供してくれているのでこれが大きな障壁になることはないかと思います。
あとは、既存のシステムにPydanticを導入するケースですかね。部分的にPydanticを導入していけばいいと思いますが、一貫性を持たせるために最終的には既存のコードもPydanticに書き換えるとなると規模にもよりますが多大な労力がかかることが障壁になり得ると考えます。
あとは、Pythonの動的型付け言語の特徴でもある「型を意識せずに処理が書ける」といった柔軟性や効率性をメリットとして考えている層もいると思うので、そことの折り合いを付ける必要があるというのももしかしたらあるかもしれないなぁと…
前述のデメリットもありますので、すべてのプロジェクトやチームにとって最適なアプローチになるとは限らないと思いますが、個人的にPydanticは型安全性のないPythonの弱点を補う強力なツールなので無意識レベルで使っていきたいと考えています。