From 139b5131a01eec1def0c83711e3c0cae2a4f1f74 Mon Sep 17 00:00:00 2001 From: "jetbrains-junie[bot]" <201638009+jetbrains-junie[bot]@users.noreply.github.com> Date: Thu, 26 Feb 2026 23:10:14 +0000 Subject: [PATCH] =?UTF-8?q?Schema=E3=82=B8=E3=82=A7=E3=83=8D=E3=83=AA?= =?UTF-8?q?=E3=83=83=E3=82=AF=E3=83=A9=E3=83=83=E3=83=91=E3=83=BC=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0=E3=81=A8IDE=E8=A3=9C=E5=AE=8C=E5=AF=BE=E5=BF=9C?= =?UTF-8?q?=E3=83=97=E3=83=AB=E3=83=AA=E3=82=AF=E3=83=AC=E3=83=93=E3=83=A5?= =?UTF-8?q?=E3=83=BC=20=20Empty?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +++ src/validkit/__init__.py | 2 +- src/validkit/validator.py | 44 +++++++++++++++++++++++++++++++++++---- 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index d20c1f0..4829242 100644 --- a/README.md +++ b/README.md @@ -139,6 +139,9 @@ result = validate(data, SCHEMA) print(result["name"]) # ← IDE が "name" / "level" を補完してくれる ``` +注意: +- `collect_errors=True` を指定した場合、`validate` は `ValidationResult` を返します。そのため、`Schema[T]` を使っていても戻り値の型は `T` ではなく `ValidationResult` になります。 + TypedDict を書くのが面倒な場合は、既存の辞書スキーマを渡す使い方もそのまま使えます。 型補完が不要なケースでは、変数側に型注釈を書くことで mypy / pyright に型を伝えられます。 diff --git a/src/validkit/__init__.py b/src/validkit/__init__.py index e3e7d40..61a5308 100644 --- a/src/validkit/__init__.py +++ b/src/validkit/__init__.py @@ -1,5 +1,5 @@ from .v import v from .validator import validate, ValidationError, Schema -__version__ = "1.1.1" +__version__ = "1.1.0" __all__ = ["v", "validate", "ValidationError", "Schema"] diff --git a/src/validkit/validator.py b/src/validkit/validator.py index 348ad65..26d6642 100644 --- a/src/validkit/validator.py +++ b/src/validkit/validator.py @@ -1,4 +1,15 @@ -from typing import Any, Dict, Generic, List, Optional, TypeVar, overload, TYPE_CHECKING +from typing import ( + Any, + Dict, + Generic, + List, + Optional, + TypeVar, + Union, + overload, + TYPE_CHECKING, + Literal, +) from .v import Validator, v T = TypeVar("T") @@ -18,6 +29,7 @@ class UserDict(TypedDict): SCHEMA: Schema[UserDict] = Schema({"name": v.str(), "age": v.int()}) + data: UserDict = {"name": "Alice", "age": 30} result = validate(data, SCHEMA) # inferred as UserDict by the IDE print(result["name"]) # IDE completes "name" / "age" """ @@ -165,7 +177,19 @@ def validate( partial: bool = ..., base: Any = ..., migrate: Optional[Dict[str, Any]] = ..., - collect_errors: bool = ..., + *, + collect_errors: Literal[True], + ) -> ValidationResult: ... + + @overload + def validate( + data: Any, + schema: Schema[T], + partial: bool = ..., + base: Any = ..., + migrate: Optional[Dict[str, Any]] = ..., + *, + collect_errors: Literal[False] = ..., # default ) -> T: ... @overload @@ -175,7 +199,19 @@ def validate( partial: bool = ..., base: Any = ..., migrate: Optional[Dict[str, Any]] = ..., - collect_errors: bool = ..., + *, + collect_errors: Literal[True], + ) -> ValidationResult: ... + + @overload + def validate( + data: Any, + schema: Any, + partial: bool = ..., + base: Any = ..., + migrate: Optional[Dict[str, Any]] = ..., + *, + collect_errors: Literal[False] = ..., # default ) -> Any: ... @@ -186,7 +222,7 @@ def validate( base: Any = None, migrate: Optional[Dict[str, Any]] = None, collect_errors: bool = False, -) -> Any: +) -> Union[Any, "ValidationResult"]: # Unwrap Schema[T] to its underlying dict schema if isinstance(schema, Schema):