Package for deep serializing and deserializing
Project description
Python Deep Serializer
Package provides for
-
Serializing nested Python objects. That is creating a nested dictionary from a nested Python object.
-
Deserializing nested Python objects, that is initializing nested Python objects with a nested dictionary.
One use case is when you have a web api and users post nested json which you use to initialize (nested) Python objects.
Example
from pprint import pprint
import datetime
import typing
from deep_serializer import des
from deep_serializer.ser import ToDictEnabled
class Person(ToDictEnabled):
@des.cast # casting input
def __init__(self, name: str, age: int):
self.name = name
self.age = age
class Car(ToDictEnabled):
@des.cast # casting input
def __init__(self, model: str, owner: Person, color: str, registration_date: datetime.datetime,
passengers: typing.List[Person] = (), miles: typing.Dict[datetime.datetime, float] = None):
self.miles = miles
self.model = model
self.owner = owner
self.color = color
self.registration_date = registration_date
self.passengers = passengers
self.__private_variable = 'secret' # private attribute not serialized by todict
@property
def color_and_owner(self) -> str: # property not serialized by todict
return '%s-%s' % (self.color, self.owner.name)
if __name__ == '__main__':
car_dict = {
'color': 'blue',
'model': 'Volvo',
'owner': {'age': '22', 'name': 'Bob'},
'passengers': [{'age': 20, 'name': 'Alice'}, {'age': 19, 'name': 'Joe'}],
'registration_date': '2015-01-01 12:00.00',
'miles': {'2015-01-01 12:00.00': 0, '2016-01-01 12:00.00': '1000'}
}
print('\n\nInput')
pprint(car_dict)
car = Car(**car_dict)
print('\n\nCar object:\n%s' % car)
print('\n\nCar as dict')
pprint(car.todict(), indent=4)
Note that
- The
ToDictEnabled
adds thetodict
method which enables deep serialization. - The
@des.init
property tries to cast input variables according to their type hints before actual init is run. - The
@color_and_owner
property is not serialized. - The
__private_variable
attribute is not serialized.
Running main yields
Input
{'color': 'blue',
'miles': {'2015-01-01 12:00.00': 0, '2016-01-01 12:00.00': '1000'},
'model': 'Volvo',
'owner': {'age': '22', 'name': 'Bob'},
'passengers': [{'age': 20, 'name': 'Alice'}, {'age': 19, 'name': 'Joe'}],
'registration_date': '2015-01-01 12:00.00'}
Car object:
<__main__.Car object at 0x7f4972796cf8>
Car as dict
{ 'color': 'blue',
'miles': { datetime.datetime(2015, 1, 1, 12, 0): 0.0,
datetime.datetime(2016, 1, 1, 12, 0): 1000.0},
'model': 'Volvo',
'owner': {'age': 22, 'name': 'Bob'},
'passengers': [{'age': 20, 'name': 'Alice'}, {'age': 19, 'name': 'Joe'}],
'registration_date': datetime.datetime(2015, 1, 1, 12, 0)}
Caveats
-
Code is virtually untested, except on a few minor private projects.
-
Casting is far from complete. For example, the
typing.Tuple[]
type hinting does not work, and those input variables will not be casted. -
Only works with Python3, only tested with Python3.6 and Python3.7.
-
todict
method will not serialize attributes starting with__
and not serialize properties.
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
File details
Details for the file deep_serializer-0.0.6.tar.gz
.
File metadata
- Download URL: deep_serializer-0.0.6.tar.gz
- Upload date:
- Size: 5.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.12.1 pkginfo/1.4.2 requests/2.18.4 setuptools/39.0.1 requests-toolbelt/0.8.0 tqdm/4.19.5 CPython/3.6.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 |
140dcb8dd15cdab8e27a64520a76dd83a7e0cdd41b2682c30b6acf31f1b2495f
|
|
MD5 |
ac7512153a331c476786afc0cb7ab77b
|
|
BLAKE2b-256 |
dfd3d7597c65ed78eb97aa5ef52288c6b8277fa4d4e5bad334a9d29922addeb0
|