Provides a lightweight `attr()` descriptor factory that adds runtime validation to dataclass fields.
Project description
validating
validating is a lightweight runtime validation library focused on making
dataclass fields and function arguments safer and easier to validate.
It exposes three main entry points:
attr(...): declare validated fields (type checks, bounds, allow/deny lists, custom validators)@dataclass(...): a compatible enhancement ofdataclasses.dataclasswith automatic validation integration@validate: a decorator that validates function arguments using type annotations
Installation
pip install validating
Quick Start
from validating import attr, dataclass
@dataclass
class UserConfig:
age: int = attr(lb=0)
role: str = attr(allowlist=["admin", "user"])
cfg = UserConfig(age=18, role="admin")
cfg.age = 20 # ✅
cfg.role = "user" # ✅
# cfg.age = -1 # ❌ ValueError
# cfg.role = "guest" # ❌ ValueError
Core API
attr(...)
Declares a descriptor-backed field that validates values on initialization and assignment.
Common parameters:
default: default valuedefault_factory: lazy default factory (mutually exclusive withdefault)allowlist: whitelist of allowed valuesdenylist: blacklist of forbidden valueslb/ub: inclusive lower / upper boundsslb/sub: exclusive lower / upper boundsvalidator: custom validator function with signatureCallable[[Any], bool]init/repr/hash/compare/kw_only: forwarded dataclass field behavior controls
Error semantics:
- Misconfiguration at class-definition time (for example, default type mismatch) raises
ValidatorError - Invalid runtime values raise
TypeErrororValueError
@dataclass(...)
validating.dataclass is a compatible enhanced wrapper around dataclasses.dataclass.
Enhancements:
- Automatic default promotion:
x: int = 1is promoted toattr(default=1) - Method argument validation: when
validate_methods=True(by defaultFalse), all public methods are wrapped withvalidate(including@staticmethodand@classmethod)
from validating import dataclass
@dataclass(validate_methods=True)
class Service:
retries: int = 3
def run(self, timeout: int) -> int:
return timeout + self.retries
svc = Service()
svc.run(1) # ✅
# svc.run("1") # ❌ TypeError
@validate
Enables call-time argument validation based on type annotations.
from typing import Literal
from validating import validate
@validate
def configure(mode: Literal["dev", "prod"], workers: int):
return mode, workers
configure("dev", 4) # ✅
# configure("test", 4) # ❌ TypeError
@validate also handles assert statements in validated functions:
assert <expr>, "custom message"keeps the originalAssertionErrorwith your message.assert <expr>(without message) is converted to aValueErrorwhen<expr>is a direct assertion on function arguments, with a message likeexpected <expr>, got <value> instead.- Assertions that are not direct checks on function arguments are left as regular
AssertionError.
from validating import validate
@validate
def check_score(score: int) -> int:
assert score >= 60
return score
check_score(80) # ✅
# check_score(59) # ❌ ValueError: expected score >= 60, got 59 instead
More Examples
1) default_factory
from validating import attr, dataclass
@dataclass
class Cache:
items: list[int] = attr(default_factory=list)
2) Complex type hints
from typing import Literal
from validating import attr, dataclass
@dataclass
class AppConfig:
mode: Literal["dev", "prod"] = attr()
token: int | str = attr()
mapping: dict[str, int] = attr()
3) Custom validator
from validating import attr, dataclass
@dataclass
class EvenNumber:
value: int = attr(validator=lambda x: x % 2 == 0)
Notes
- Dataclasses with
slots=Trueare currently not supported. - This project focuses on runtime validation and does not replace static type checking.
See Also
License
This project falls under the BSD 3-Clause License.
History
v0.0.2
- Fixed runtime checking for
TypedDictand several special typing hints to avoid invalidisinstancepaths. - Added runtime validation support for
typing.Unpack-style annotations. - Improved forward-reference handling under
TYPE_CHECKINGimports, including deferred annotation resolution and safer fallback behavior when references are temporarily unresolved. - Refined the
@validateargument-checking path for better robustness and consistency across annotated call patterns.
v0.0.1
- Initial release.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file validating-0.0.2.tar.gz.
File metadata
- Download URL: validating-0.0.2.tar.gz
- Upload date:
- Size: 21.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8db8d7cb7e3773fb0586e0ab8db4ee4c3720e65f72511491b90b9e9069e2c59e
|
|
| MD5 |
cd01ae0b48ae7016d58ecfee069d7a20
|
|
| BLAKE2b-256 |
1aaec7f613fbfbc87e2cf9f169ba68b8fd6f1571239c48270e24cdb8269067d6
|
File details
Details for the file validating-0.0.2-py3-none-any.whl.
File metadata
- Download URL: validating-0.0.2-py3-none-any.whl
- Upload date:
- Size: 17.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9c16c77e0df79462ef5014b2c59994b48996fd4b5680081f013ce089fae841c7
|
|
| MD5 |
56b3934772df1c68bd2659f0f7945233
|
|
| BLAKE2b-256 |
4c3867c70dbea5c737da9e118685b39440f452997c638218294520f9dcb80228
|