Dataclass with data validation.
Project description
ValidatedDC
Dataclass with data validation. Checks the value of its fields by their annotations.
Capabilities
ValidatedDC
is a regular Python dataclass.
- Support for standard types and custom Python classes.
- Support for some aliases from the
typing
module, namely:Any
,List
,Literal
,Optional
,Union
. These aliases can be embedded in each other. - When initializing an instance of a class, you can use the value of the field
dict
instead of theValidatedDC
instance specified in the field annotation (useful, for example, when retrieving data via api). - Data validation occurs immediately after an instance is created, and can also be run by the
is_valid()
method at any time. - The
get_errors()
method will show the full traceback of errors in the fields, including errors of nested classes.
See detailed in the examples
folder.
Installation
pip install validated-dc
Quick example
from dataclasses import dataclass
from typing import List, Union
from validated_dc import ValidatedDC
# Some combinations of List and Union
@dataclass
class Foo(ValidatedDC):
value: Union[int, List[int]]
@dataclass
class Bar(ValidatedDC):
foo: Union[Foo, List[Foo]]
# --- Valid input ---
foo = {'value': 1}
instance = Bar(foo=foo)
assert instance.get_errors() is None
assert instance == Bar(foo=Foo(value=1))
foo = {'value': [1, 2]}
instance = Bar(foo=foo)
assert instance.get_errors() is None
assert instance == Bar(foo=Foo(value=[1, 2]))
foo = [{'value': 1}, {'value': 2}]
instance = Bar(foo=foo)
assert instance.get_errors() is None
assert instance == Bar(foo=[Foo(value=1), Foo(value=2)])
foo = [{'value': [1, 2]}, {'value': [3, 4]}]
instance = Bar(foo=foo)
assert instance.get_errors() is None
assert instance == Bar(foo=[Foo(value=[1, 2]), Foo(value=[3, 4])])
# --- Invalid input ---
foo = {'value': 'S'}
instance = Bar(foo=foo)
assert instance.get_errors()
assert instance == Bar(foo={'value': 'S'})
# fix
instance.foo['value'] = 1
assert instance.is_valid()
assert instance.get_errors() is None
assert instance == Bar(foo=Foo(value=1))
foo = [{'value': [1, 2]}, {'value': ['S', 4]}]
instance = Bar(foo=foo)
assert instance.get_errors()
assert instance == Bar(foo=[{'value': [1, 2]}, {'value': ['S', 4]}])
# fix
instance.foo[1]['value'][0] = 3
assert instance.is_valid()
assert instance.get_errors() is None
assert instance == Bar(foo=[Foo(value=[1, 2]), Foo(value=[3, 4])])
# --- get_errors() ---
foo = {'value': 'S'}
instance = Bar(foo=foo)
print(instance.get_errors())
# {
# 'foo': [
# # An unsuccessful attempt to use the dictionary to create a Foo instance
# InstanceValidationError(
# value_repr="{'value': 'S'}",
# value_type=<class 'dict'>,
# annotation=<class '__main__.Foo'>,
# exception=None,
# errors={
# 'value': [
# BasicValidationError( # because the str isn't an int
# value_repr='S', value_type=<class 'str'>,
# annotation=<class 'int'>, exception=None
# ),
# BasicValidationError( # and the str is not a list of int
# value_repr='S', value_type=<class 'str'>,
# annotation=typing.List[int], exception=None
# )
# ]
# }
# ),
# BasicValidationError( # the dict is not a list of Foo
# value_repr="{'value': 'S'}",
# value_type=<class 'dict'>,
# annotation=typing.List[__main__.Foo],
# exception=None
# )
# ]
# }
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
validated-dc-1.2.tar.gz
(6.7 kB
view hashes)
Built Distribution
Close
Hashes for validated_dc-1.2-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 690f10bd7379b693c08e25d48756d2fd40e1f1c7f457148dff2256e2d1461902 |
|
MD5 | d248424b6396539f585d96c46734d3ae |
|
BLAKE2b-256 | 4ab42e595c504cab957e28e340ff25996a4887d3598fa421e81fe319fdb19cb1 |