nikkie-ftnextの日記

イベントレポートや読書メモを発信

Pydanticがv2にメジャーバージョンアップ! v1もサポートされているし、移行ツールbump-pydanticもあるし、破壊的変更は怖くない(はず)

はじめに

もう何も怖くない。 nikkieです

FastAPIやLangChainといったライブラリが依存していることでおなじみPydantic!
約2週間前、6月の終わりにv1.10.xからv2へとメジャーバージョンアップしました。
破壊的変更1もあります😰
ですが、他のライブラリのメジャーバージョンアップと比べてそんなに怖くないかもしれません。
※アップグレードを経験中の身でのアウトプットですので、未来の私が全力でテノヒラクルーする可能性はあります

更新履歴

  • PyDantic 表記するものと誤解していたことに気づき、Pydantic表記に修正しました (2023/07/17)

目次

Pydantic v2.0🎉

2023/06/30 リリース👏

FastAPIも間髪入れずにPydantic v2をサポートしていますね(v0.100.0〜)

Pydanticのマイグレーションガイドはこちらです✨

脱線:v2で何が変わったの?

Rustの力を得たそうです💪

作者さんが今年のPyCon USで話されてます(積ん読

アップグレードの小さな成功体験

先日の小さいスクリプト2は、Pydantic v2の環境を用意しても動きました🙌

  • Python 3.11.4
  • 新しい仮想環境でpip install pydantic
% pip freeze
annotated-types==0.5.0
pydantic==2.0.3
pydantic_core==2.3.0
typing_extensions==4.7.1

% python my_langchain.py
Chain(verbose=False)
---- Set verbose True ----
Chain(verbose=True)

大きいコードベースもv2にアップグレードしちゃおう。v1のAPIもサポートされているから

ですが、実プロジェクトでのアップグレードはこんなにたやすくはいかないでしょう。
マイグレーションガイドは長々と続くため、多くの変更が入ったと想像されます。
それでもアップグレードしていきたいと考える理由がこちら

https://github.com/pydantic/pydantic/tree/v2.0.3#pydantic-v110-vs-v2

Pydantic V2 also ships with the latest version of Pydantic V1 built in so that you can incrementally upgrade your code base and projects: from pydantic import v1 as pydantic_v1.

pip install -U pydanticとv2に上げた後、pydantic.v1の下にはv1のAPIが残っているんですね。
なので、Pydantic自体をv2に上げた後、実装はv1を使うようにして「うちのプロジェクトは最新のPydantic v2を使ってます」とドヤれます3
光速でドヤるのが目的じゃないと思うので、「you can incrementally upgrade your code base」とあるように小さく小さくv2を使うように移行していきましょう〜

移行ツール bump-pydantic ♻️

FastAPIの作者tiangoloさんがスターされていて存在を知りました。

マイグレーションガイドは重厚ですが、このツールがどう書き換えればいいか教えてくれます
マイグレーションをサポートするツールを用意したのがめちゃくちゃうまいな〜と思うのです。
ドキュメントを読み解くのは大変ですが、サポートツールが教えてくれたところだけ理解して適用すればよく、作業の大変さがかなり軽減されていると感じます。

素振り案

実プロジェクトより小さい規模でアップグレードを練習できないかな〜と考えて、浮かんだ案を記します。
近日中に手を動かすぞ

終わりに

Pydanticのv2へのメジャーバージョンアップ、以下の理由によりもう何も怖くないと記しました。

  • pydanticの下はv2のAPIですが、pydantic.v1の下にv1のAPIが残っている
    • このおかげで、とりあえずv2まで上げることができる(v1のAPI使うけど)
  • ツールbump-pydanticでv1からv2の書き方が指南される

v1のAPIを丸々移して残しておく、ドキュメントだけでなくツールでもマイグレーションをサポートする、この2点はOSS開発としてうまいな〜と思いました。


  1. セマンティック・バージョンニングによれば、非互換なAPIの変更(incompatible API changes)をするときにメジャーバージョンが上がります
  2. なぜmy_langchain.pyという名なのかはこちらをどうぞ
  3. 心の声(使っているAPIはv1で、外面のバージョンだけ上げただけなんですけどね)
  4. 監訳者Hayaoさんによる紹介スライド