PR

Pydanticで配列の要素数を制限する方法

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

Pydanticで、配列の要素数に制限を設ける方法に関して解説します。

環境

  • Python: 3.11.2
  • Pydantic: 1.10.4

conlistを使用して、最大要素数を設定する方法

conlistを使用すれば、配列に制約を設けることが可能です。

以下は、配列の要素数を2以下にしたい時の例です。
max_itemsを指定することで最大要素数を設定できます。

from pydantic import BaseModel, conlist

class TestModel(BaseModel):
    test_list: conlist(int, max_items=2)

試しに実行してみると、要素数が2の時は正常に実行され、要素数が3の時にValidationErrorが出力されていることが分かります。

from pydantic import BaseModel, conlist

class TestModel(BaseModel):
    test_list: conlist(int, max_items=2)


print(TestModel(test_list=[1,2]))
# test_list=[1, 2]

print(TestModel(test_list=[1,2,3]))
"""
Traceback (most recent call last):
  File "/root/src/test_pydantic.py", line 9, in <module>
    print(TestModel(test_list=[1,2,3]))
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  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 TestModel
test_list
  ensure this value has at most 2 items (type=value_error.list.max_items; limit_value=2)
"""

最小要素数を設定する方法

同様にconlistを使用し、今度はmin_itemsを指定します。

以下は、配列の要素数を1以上にしたい時の例です。
要素数が1の時は正常に実行され、要素数が0の時にValidationErrorが出力されていることが分かります。

from pydantic import BaseModel, conlist

class TestModel(BaseModel):
    test_list: conlist(int, min_items=1)


print(TestModel(test_list=[1]))
# test_list=[1]

print(TestModel(test_list=[]))
"""
Traceback (most recent call last):
  File "/root/src/test_pydantic_min.py", line 10, in <module>
    print(TestModel(test_list=[]))
          ^^^^^^^^^^^^^^^^^^^^^^^
  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 TestModel
test_list
  ensure this value has at least 1 items (type=value_error.list.min_items; limit_value=1)
"""

まとめ

Pydanticで配列の要素数に制限を設ける方法に関して、記載しました。
Pydanticを用いることで、Pythonでも簡単に型を指定できたりValidationを設けることができるので、是非使ってみてください。

また、他にもPydanticに関する記事を記載しておりますので、良かったら覗いていってもらえると嬉しいです。

コメント

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