Object tree serialization library for python
Project description
ctor
ctor
is an object tree serialization library.
It provides non-invasive way of constructing and deconstructing objects based on type annotations.
Installation:
pip install ctor
Features
- 0 dependencies
- Your classes are yours! Library does not mess with your code.
- No subclassing / metaclassing
- No special class-level field annotations
- Library does no replace/generate
__init__
and/or other methods
- Works with
dataclasses
,attrs
,PyDantic
and even pure-python classes. - Extendable if needed
- Supports
Union
,Literal
,Annotated
, forward references, cyclic-types ... - PyCharm and other IDEs highlight constructor arguments natively without plugins
- Supports Python 3.7+
Example with python dataclasses
from dataclasses import dataclass # standard python
@dataclass
class MyClass:
name: str
value: int
# some_other_file.py
# note that this import might be in a different file
# so that your code remains untouched by serialization logic
import ctor
# Dumping
my_object = MyClass(name='hello', value=42)
data = ctor.dump(my_object)
print(data) # {'name': 'hello', 'value': 42}
# Loading
data = {'name': 'World', 'value': -42}
restored_object = ctor.load(MyClass, data)
print(restored_object) # MyClass(name='world', value=-42)
Nested objects with dataclasses
from dataclasses import dataclass # standard python
from typing import List
@dataclass
class TreeNode:
name: str
children: List['TreeNode'] # Note: forward reference making class cyclic
graph = TreeNode(name="root", children=[
TreeNode(name="A", children=[]),
TreeNode(name="B", children=[
TreeNode(name="x", children=[]),
TreeNode(name="y", children=[]),
]),
TreeNode(name="C", children=[]),
])
# Note: Even in this complex scenario, classes and data are still untouched by the library code.
import ctor
graph_data = ctor.dump(graph)
print(
graph_data) # {'name': 'root', 'children': [{'name': 'A', 'children': []}, {'name': 'B', 'children': [{'name': 'x', 'children': []}, {'name': 'y', 'children': []}]}, {'name': 'C', 'children': []}]}
Bare classes
class User:
def __init__(self, uid: int, email: str, name: str):
self.uid = uid
self.email = email
self.name = name
class Post:
def __init__(self, title: str, content: str, author: User):
self.title = title
self.content = content
self.author = author
import
ctor # Import placed here just to highlight that your business-level code still does not require serialization library
data = {
'content': 'Fields can go in any order also',
'author': {
'uid': 123,
'email': 'john@doe.org',
'name': 'John Doe'
},
'title': 'Unbelievable'
}
post = ctor.load(Post, data) # post is a normal python object here
print(post.author.name) # post.user is a User
Note that this is not just Post(**data)
because you need to construct User
object first.
This works with objects of any depth.
Implementation described lower in the README.
Running tests
- To test against current python version:
pytest
- To tests all python versions:
tox --parallel
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
ctor-0.1.0.tar.gz
(13.8 kB
view details)
Built Distribution
ctor-0.1.0-py3-none-any.whl
(13.1 kB
view details)
File details
Details for the file ctor-0.1.0.tar.gz
.
File metadata
- Download URL: ctor-0.1.0.tar.gz
- Upload date:
- Size: 13.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.7.1 importlib_metadata/4.9.0 pkginfo/1.8.2 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.0
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | e3a0cdbf65dce98fe5bc4bc054cef494cbbe245c3d56126d362593cb7ef7353d |
|
MD5 | f055e64e14babe0ad807f564e284516d |
|
BLAKE2b-256 | e8f8226d3cae3e3db18abde138275feb1d82c5e617f3fe87f4e3ef48ac695464 |
File details
Details for the file ctor-0.1.0-py3-none-any.whl
.
File metadata
- Download URL: ctor-0.1.0-py3-none-any.whl
- Upload date:
- Size: 13.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.7.1 importlib_metadata/4.9.0 pkginfo/1.8.2 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.0
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9a3ddcfe4d165beeecc4060abba055ee2282a8f1b0fc0d852f964063fd39dc87 |
|
MD5 | 9606a25ac66d84835cf40a610a802749 |
|
BLAKE2b-256 | 9ed228577cc65bf5a6d129207cdeba890f5739f0627fe1cd8e9d6474a4aacf3a |