PR

【Pydantic】コンストラクタ__init__を使用して、初期処理を実行

Python
記事内に広告が含まれています。

Pydanticで、コンストラクタ(__init__)を使用する方法に関して解説します。

環境

  • Python: 3.11.2
  • Pydantic: 1.10.4

コンストラクタを使用する方法

super()を使用

__init__を定義し、super()で親クラス(BaseModel) の__init__を呼び出します。

例では、__init__内でtotal_priceにpriceとcountの積を代入する処理を行っています。

from pydantic import BaseModel


class Price(BaseModel):
    price: int
    count: int
    total_price: int = 0

    def __init__(self, price, count):
        super().__init__(price=price, count=count)
        self.total_price = price * count

実際にインスタンスを生成すると、意図した通りにtotal_priceが設定されることが分かります。

price = Price(price=100, count=2)

print(price)
# price=100 count=2 total_price=200

注意点

super()を使用すること

super()を使用せずに__init__を定義した場合、下記のようにエラーが出力されます。

from pydantic import BaseModel


class Price(BaseModel):
    price: int
    count: int
    total_price: int = 0

    def __init__(self, price, count):
        self.total_price = price * count


price = Price(price=100, count=2)

print(price)
"""
Traceback (most recent call last):
  File "/root/src/test_pydantic_init.py", line 13, in <module>
    price = Price(price=100, count=2)
            ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/root/src/test_pydantic_init.py", line 10, in __init__
    self.total_price = price * count
    ^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/pydantic/main.py", line 406, in __setattr__
    self.__fields_set__.add(name)
    ^^^^^^^^^^^^^^^^^^^
AttributeError: 'Price' object has no attribute '__fields_set__'. Did you mean: '__fields__'?
"""

__init__で代入する値を必須にしないこと

__init__で代入する値を必須にした場合、Priceインスタンス生成時に指定する必要が出てくるのでエラーになります。

from pydantic import BaseModel


class Price(BaseModel):
    price: int
    count: int
    total_price: int

    def __init__(self, price, count):
        super().__init__(price=price, count=count)
        self.total_price = price * count


price = Price(price=100, count=2)

print(price)
"""
Traceback (most recent call last):
  File "/root/src/test_pydantic_init.py", line 14, in <module>
    price = Price(price=100, count=2)
            ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/root/src/test_pydantic_init.py", line 10, in __init__
    super().__init__(price=price, count=count)
  File "/usr/local/lib/python3.11/site-packages/pydantic/main.py", line 342, in __init__
    raise validation_error
pydantic.error_wrappers.ValidationError: 1 validation error for Price
total_price
  field required (type=value_error.missing)
"""

まとめ

Pydanticで、コンストラクタ(__init__)を使用する方法に関して記載しました。

Pydanticで__init__を使用したい場面は多くはないと思われますが、使用することで応用が効くので是非試してみてください。

コメント

タイトルとURLをコピーしました