Fast validation with error messages – validate_data_fast¶
Added in version 0.6.0: (experimental)
validate_data_fast is a preview of the next‑generation validation engine.
It provides the the closest speed to compiled rules plus full
error messages and support for nested dicts.
In a future release, validate_data_fast will
become the default implementation of validate_data, keeping the exact same
API but with dramatically better performance.
Use it today to speed up existing code with minimal changes.
Basic usage¶
from validatedata import validate_data_fast
result = validate_data_fast(
data={'username': 'al', 'email': 'alice@example.com'},
rule={
'username': 'str|min:3|max:32',
'email': 'email',
},
)
if not result.ok:
print(result.errors) # ['username: string too short (minimum length: 3)']
# It returns the same `ValidationResult` as `validate_data`.
Differences from validate_data¶
Faster – uses compiled function calls, no per‑call recursion overhead.
No ``defaults`` parameter (yet) – but you can use mutate and raise_exceptions.
No ``keys`` wrapper – only bare dict rules (mirror‑structure) are supported.
No ``depends_on`` – conditional validation is not yet implemented in the fast path.
No custom transforms – only pipe‑syntax transforms (
strip,lower, etc.) work.
All other features (pipe syntax, mirror‑structure, nullable, range,
options, regex, custom error messages, and nested dicts) are fully supported.
Performance comparison¶
For a dict with 5 fields, validate_data_fast is typically 5–10x faster
than validate_data and within 10% of the boolean‑only validator(),
while still returning descriptive error messages.
# Instead of
result = validate_data(data, rule)
# Just change the function name
result = validate_data_fast(data, rule)
# Everything else stays the same
Current limitations (will be removed before merging)¶
No support for
depends_on.No support for custom callable transforms (only named pipe transforms).
No support for the
{'keys': {...}}wrapper – use bare dicts.No support for validating tuple/list of dicts with per‑position rules (but you can wrap the list in a dict or use a loop).
These limitations exist because the fast engine is still under development.
They will be resolved before validate_data_fast replaces validate_data.
When to use¶
Existing projects – try replacing
validate_datawithvalidate_data_fast. If you don’t use the unsupported features, you get a free performance boost.New projects – start with
validate_data_fastand switch tovalidate_dataonly if you needdepends_onor custom callable transforms.High‑throughput APIs – use
validator()for boolean checks, orvalidate_data_fastwhen you need error messages.
Feedback¶
This is an experimental feature. Please report any discrepancies between
validate_data and validate_data_fast on the issue tracker – they help
us ensure a smooth eventual merge.