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__を使用したい場面は多くはないと思われますが、使用することで応用が効くので是非試してみてください。
 
  
  
  
  

コメント