LoginSignup
4
2

More than 1 year has passed since last update.

PythonのTypedDictのキーの有無・値の型をチェックするツールtypeddict-validatorを作った

Last updated at Posted at 2022-04-21

JSON を受け取る API などでは、多くの場合で何らかのバリデーションをしていると思うが、そのバリデーションに Python の TypedDict を使えるようにしてみました。

概要

TypedDict を使って辞書型のデータをバリデーションするユーティリティ。辞書が必要なキーを持っているかや、値が適切な型を持っているかを再帰的にチェックします。 API リクエストや何らかのファイルのような、 JSON や YAML をデシリアライズするシーンで便利です。

現在のところ、一般的な型および Optional を含む Union 型をサポートしています。

要件

  • Python 3.10 以降

インストール

PyPI からインストールできます。
https://pypi.org/project/typeddict-validator/

pip install typeddict-validator

つかいかた

validate_typeddict が本体です。辞書型のデータと TypedDict の型 (T) を渡します。返り値は TypeGuard[T] なので、辞書が入力された TypedDict の型のオブジェクトであることが保証されます。

>>> from typing import TypedDict
>>> from typeddict_validator import validate_typeddict
>>>
>>> PersonDict = TypedDict("PersonDict", {"name": str, "age": int, "interests": list[str]})
>>>
>>> person = {"name": "Taro Yamada", "age": 30, "interests": ["programming", "painting"]}
>>>
>>> if validate_typeddict(person, PersonDict):
...     print("It's a PersonDict!")
It's a PersonDict!

デフォルトでは、一致しない場合にエラーを投げます。

>>> robot = {"name": "Doraemon"}
>>>
>>> if validate_typeddict(robot, PersonDict):
...     print("It's a PersonDict!")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/app/typeddict_validator/validate.py", line 37, in validate_typeddict
    raise DictMissingKeyException(key=k)
typeddict_validator.validate.DictMissingKeyException

silent=True オプションを使って黙らせることもできます。この場合、エラーではなく False を返します(ただし 第2引数が TypedDict でない時は ValueError を返す)。

>>> if not validate_typeddict(robot, PersonDict, silent=True):
...     print("It's not a PersonDict!!")
It's not a PersonDict!!

ほかのサンプルを見るには validate/validate_test.py をご参照ください。

さいごに

基本的な用途においては十分かと思いますが、まだまだサポートできていない機能やエンハンスの余地は多いと思います。気になった方はぜひ使ってみて、不便なところがありましたら Pull Request などをしていただけますと大変喜びます。

それではよい Python ライフを~。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2