概要
FastAPIでpydantic
を使ったコードを実行したら、以下のエラーが出た。
IPv4Address
とはなんぞや?pydantic
と関係あるの?と思ったので調べてみました。
from pydantic import BaseModel
File "pydantic/__init__.py", line 2, in init pydantic.__init__
File "pydantic/dataclasses.py", line 43, in init pydantic.dataclasses
# | <blank> | No action: no method is added. |
File "pydantic/error_wrappers.py", line 4, in init pydantic.error_wrappers
File "pydantic/json.py", line 5, in init pydantic.json
ImportError: cannot import name IPv4Address
ImportError
の原因
このエラーは、ImportError
の通り、pydantic
モジュールにおいてIPv4Address
のインポートが失敗していることに起因しています。
通常、IPv4Address
クラスは Python の標準モジュールである ipaddress
モジュールに含まれています。しかし、pydantic
モジュールが内部でipaddress
を使う場合、Pythonの環境によってはipaddress
モジュールが見つからない場合があるよう。(Python 3.3以上のバージョンを使用している場合は、通常ipaddress
モジュールが標準で含まれているようです)
以下でインストールできます。
pip install ipaddress
IPv4Address
とpydantic
の関係とは?
IPv4Address
は、IPv4(Internet Protocol version 4)
アドレスを表すためのクラス。
このクラスを使用すると、IPv4アドレスのパース、検証、ネットワークアドレスの取得などが容易に行えます。
公式ドキュメント:ipaddress --- IPv4/IPv6 操作ライブラリ
class ipaddress.IPv4Address(address)
IPv4 アドレスを構築する。 address が正しい IPv4 アドレスでない場合、 AddressValueError を発生させます。
なぜこれがpydantic
と関係あるの?と思ったら、pydantic
は、データのバリデーションに際して、データ型やフォーマットの指定ができる柔軟性を持っていて、IPv4アドレスなどの特定のデータ型をバリデーションする際にも利用されることがあるからですね。x
ということでpydantic
はIPv4Address
を含む様々なデータ型をサポートし、データのバリデーションを行える汎用的なデータ処理ライブラリ、ゆえに上述のインポートエラーが表示されたというわけです。
以前、pydantic
やBaseModel
クラスを解説する記事を書いたのでご参考までに。
【FastAPI】Pydanticを使ってバリデーション:none is not an allowed valueエラーの解決方法