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
Simple example
from validated_dc import ValidatedDC
from dataclasses import dataclass
from typing import List, Union
@dataclass
class Foo(ValidatedDC):
foo: int
@dataclass
class Bar(ValidatedDC):
bar: Union[Foo, List[Foo]]
foo = {'foo': 1}
instance = Bar(bar=foo)
print(instance.get_errors()) # None
print(instance) # Bar(bar=Foo(foo=1))
list_foo = [{'foo': 1}, {'foo': 2}]
instance = Bar(bar=list_foo)
print(instance.get_errors()) # None
print(instance) # Bar(bar=[Foo(foo=1), Foo(foo=2)])
instance.bar.append({'foo': '3'})
print(instance.is_valid()) # False
print(instance.get_errors())
# {'bar': [InstanceValidationError(value_repr='[Foo(foo=1), Foo(foo=2),
# {...]', value_type=<class 'list'>, annotation=<class '__main__.Foo'>,
# exception=None, errors=None), InstanceValidationError(value_repr=
# "{'foo': '3'}", value_type=<class 'dict'>, annotation=<class
# '__main__.Foo'>, exception=None, errors={'foo': [BasicValidationError
# (value_repr='3', value_type=<class 'str'>, annotation=<class 'int'>,
# exception=None)]}), ListValidationError(value_repr="{'foo': '3'}",
# value_type=<class 'dict'>, annotation=<class '__main__.Foo'>,
# exception=None, item_index=2)]}
print(instance) # Bar(bar=[Foo(foo=1), Foo(foo=2), {'foo': '3'}])
instance.bar[2]['foo'] = 3
print(instance) # Bar(bar=[Foo(foo=1), Foo(foo=2), {'foo': 3}])
print(instance.is_valid()) # True
print(instance.get_errors()) # None
print(instance) # Bar(bar=[Foo(foo=1), Foo(foo=2), Foo(foo=3)]
instance.bar[2].foo = '3'
print(instance) # Bar(bar=[Foo(foo=1), Foo(foo=2), Foo(foo='3')])
print(instance.is_valid()) # False
print(instance.get_errors())
# {'bar': [InstanceValidationError(value_repr='[Foo(foo=1), Foo(foo=2),
# F...]', value_type=<class 'list'>, annotation=<class '__main__.Foo'>,
# exception=None, errors=None), InstanceValidationError(value_repr=
# "{'foo': '3'}", value_type=<class 'dict'>, annotation=<class
# '__main__.Foo'>, exception=None, errors={'foo': [BasicValidationError
# (value_repr='3', value_type=<class 'str'>, annotation=<class 'int'>,
# exception=None)]}), ListValidationError(value_repr="Foo(foo='3')",
# value_type=<class '__main__.Foo'>, annotation=<class '__main__.Foo'>,
# exception=None, item_index=2)]}
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.0.tar.gz
(6.3 kB
view hashes)
Built Distribution
Close
Hashes for validated_dc-1.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 475796939ddc68b94d4fe2dc0133a649ff6964c22106ad65bf6ca5b11ab2868d |
|
MD5 | a64fdf025cabe7933fdace8096b89196 |
|
BLAKE2b-256 | 9655509319895a66df8576061235ccfa54de6224cbe89975dadceedbc868681e |