この記事は 「Pythonって、たぶんそういう意味じゃない」シリーズ の第10弾です。
Python歴5年以上、メインで使い続けてきた変態が書いています。
この記事は 個人の経験に基づくポエムです。
環境・用途・経験によって異なる場合があります。
Discordボットの設定ファイルを辞書で読み込んでいた。
config = json.load(open("config.json"))
level = config["レベル"] # 多分int
「多分大丈夫でしょ」と思っていた。
バリデーションなんて大げさじゃないか、と。
でもその「多分」が積み重なると、どこかで必ず壊れる。
Pydanticを試した。重かった。
バリデーションをちゃんとやろうと思ったとき、
まずPydanticを試した。
from pydantic import BaseModel
class Config(BaseModel):
レベル: int
通知: bool
強力だった。でも、設定ファイルを検証したいだけなのに、クラス定義が必要だった。
日本語のキーを扱おうとすると一手間かかる。
Discordボットの小さな設定ファイルにPydanticはオーバースペックに感じた。
Pydanticが悪いわけじゃない。
「設定ファイルのバリデーションに特化した、もっと軽いものが欲しかった」という話だ。
だから作った
それがValidKitだ。
pip install validkit-py
辞書がそのままスキーマになる。クラス定義は不要。
日本語キーにも完全対応している。
from validkit import v, validate, ValidationError
SCHEMA = {
"ユーザー名": v.str().regex(r"^\w{3,15}$"),
"レベル": v.int().range(1, 100),
"設定": {
"通知": v.bool(),
"言語": v.oneof(["日本語", "English"]).optional()
}
}
data = {
"ユーザー名": "nana_kit",
"レベル": 50,
"設定": {"通知": True}
}
try:
validated = validate(data, SCHEMA)
except ValidationError as e:
print(f"エラー: {e.path} - {e.message}")
「辞書の形がそのままスキーマになる」というのが一番伝えたいことだ。
Pydanticとの連携も徹底してある
ValidKitはPydanticを否定していない。
むしろPydanticとの連携も徹底して実装してある。
大きなプロジェクトではPydantic、
設定ファイルや小さな検証にはValidKit——
そういう使い分けができる。
- Pydantic → API・複雑なデータモデル・型補完を徹底したいとき
- ValidKit → 設定ファイル・Discordボット・辞書ベースの軽い検証
「多分大丈夫」が壊れる前に
バリデーションなしの辞書アクセスは、
エラーが出たときに「どこが」「何が」おかしいかわからない。
ValidKitはエラーが起きたパスとメッセージを丁寧に返す。
# エラー発生箇所: 設定.通知 - bool型が必要です
print(f"エラー発生箇所: {e.path} - {e.message}")
「多分大丈夫」が壊れる前に、スキーマを一枚挟む。
それだけで、デバッグの時間が大幅に変わる。
- クラス定義不要 → 辞書スキーマをそのまま使える
- 日本語キー対応 → 設定ファイルを日本語で書ける
- Pydantic連携 → 既存プロジェクトとも共存できる
- エラー箇所の特定 → どこが壊れたかがすぐわかる
「バリデーションは多分大丈夫」は、大丈夫じゃなかったときに気づく。
気づく前に試してほしい。
「Pythonって、たぶんそういう意味じゃない」 シリーズでは、
こういう"なんとなくで語られがちなPython"を言語化していきます。
👉 ストックをフォローしておくと次の記事を見逃しません!