pydataclasses

Python Data Classes


License
Apache-2.0
Install
pip install pydataclasses==1.0.2

Documentation

Python Data Classes

Python Data Classes support Python 2 and 3 with many human-friendly features.

This project has been tested in Python 2.7 and Python 3.4+. It is not related to the dataclasses module introduced in Python 3.7.

Feature Support

Python Data Classes generally support

  • untyped data, typed data, and typed data list
  • arbitrary attribute names in the dictionary input
  • no python attribute naming conflict or pollution
  • lazy and auto object creation on-the-fly
  • lazy loading of the dict input (default: enabled)
  • synchronous updates of the dict input (default: disabled)

Getting Started

  • Install the Python Data Classes
pip install pydataclasses
  • Create the Python Data Classes
from pydataclasses import DataClass


class TT(DataClass):

    attr = None


class ONCE(DataClass):

    data = None


class TWICE(ONCE):

    tear = TT
    tears = [TT]

    def __init__(self, *args, **kwargs):

        super(TWICE, self).__init__(*args, **kwargs)

        self.pair = TWICE
        self.pairs = [TWICE]
  • Play with the Python Data Classes
old_data = 'hello'
new_data = 'world'
old_dict = {'data': old_data}
new_dict = {'data': new_data}

# lazy and auto object creation on-the-fly
twice = TWICE()
assert twice.pairs[1].tear.attr is None
twice.pairs[1].tear.attr = old_data
assert old_data == twice.pairs[1].tear.attr

# lazy loading of the dict input (default: enabled)
twice = TWICE(old_dict)
assert old_data == twice.data
assert old_dict == twice.__as_dict__(dict, 0)

# synchronous updates of the dict input (default: disabled)
assert old_dict != new_dict
twice = TWICE(old_dict, __sync__=True)
twice.data = new_data
assert old_dict == new_dict

Best Practices

Please

  • read and refer to pydataclasses.utils.JSONData as an example
  • put a tailored subclass between pydataclasses and your project
  • write (or copy from pydataclasses) as many tests as possible for this subclass
from pydataclasses import DataClass


class ProjectDataClass(DataClass):

    def as_dict(self, dict_class=OrderedDict):
        return self.__as_dict__(dict_class, 0)