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