Mixin which converts ``data class instance`` and others each other more simple.
Project description
Mixin which converts data class instance and others each other more simple.
Motivation
Have you ever wanted to write robust code in Python? This library will make such your wishes come true.
Define your data class which is extend OwlMixin, you can use some useful methods which help your codes robust. See following Example and API sections.
Example
You don’t need to use typing necessarily, but I recommend to use this to make your codes more robust. See PEP 484 – Type Hints.
from typing import Text, Optional
from owlmixin import OwlMixin, TList
class Food(OwlMixin):
def __init__(self, id, name, color=None):
self.id = id # type: Text
self.name = name # type: Text
self.color = color # type: Optional[Text]
class Human(OwlMixin):
def __init__(self, id, name, favorite):
self.id = id # type: Text
self.name = name # type: Text
self.favorite = Food.from_dicts(favorite) # type: TList[Food]
jiro = Human.from_dict({
"id": 10,
"name": "jiro",
"favorite": [
{"id": 1, "name": "apple"},
{"id": 2, "name": "orange", "color": "white"}
]
})
>>> jiro.id
10
>>> jiro.name
'jiro'
>>> print(jiro.favorite[0].to_pretty_json())
{
"id": 1,
"name": "apple"
}
>>> print(jiro.to_dict(ignore_none=False))
{'favorite': [{'id': 1, 'name': 'apple'}, {'color': 'white', 'id': 2, 'name': 'orange'}], 'id': 10, 'name': 'jiro'}
>>> print(jiro.to_dict())
{'favorite': [{'color': None, 'id': 1, 'name': 'apple'}, {'color': 'white', 'id': 2, 'name': 'orange'}], 'id': 10, 'name': 'jiro'}
You can also use methods chains as following.
from typing import Optional
from owlmixin import OwlMixin, TList
# `**extra` is necessary to allow extra elements.
# Note that you must define all properties in github response json if you don't use `**extra`
class Repository(OwlMixin):
def __init__(self, id, name, description, stargazers_count, **extra):
self.id = id # type: int
self.name = name # type: Text
self.description = description # type: Optional[Text]
self.star_count = stargazers_count # type: int
class GithubRepository(OwlMixin):
def __init__(self, total_count, incomplete_results, items):
self.total_count = total_count # type: int
self.incomplete_results = incomplete_results # type: bool
self.repositories = Repository.from_dicts(items) # type: TList[Repository]
>>> r = GithubRepository \
... .from_json_url("https://api.github.com/search/repositories?q=git") \
... .repositories \
... .filter(lambda x: x.star_count > 100) \
... .order_by(lambda x: x.star_count, True) \
... .map(lambda x: {
... "id": x.id,
... "message": '★{0.star_count} {0.name}'.format(x)
... }) \
... .to_csv(fieldnames=["id", "message"], with_header=True)
>>> print(r)
id,message
1062897,★45252 gitignore
36502,★15888 git
36560369,★2931 my-git
18484639,★212 git
API
From instance to another
- to_dict
instance => dict
TDict[instance] => dict
- to_dicts
TList[instance] => List[dict]
- to_json
instance => json string
- to_pretty_json
instance => json string (has indent and line break)
- to_yaml
instance => yaml string
- to_csv
TList[instance] => csv string
From something to instance
Installation
pip install owlmixin
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 Distributions
Built Distribution
Hashes for owlmixin-1.0.0rc3-py2.py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b6ee812550f621e7a26a00aafee320b28d5858efb45f1adb91260ce0aceb97a3 |
|
MD5 | 3494c0ab95836dd4cbdaec56af037333 |
|
BLAKE2b-256 | 47b569293282db9040a767fcda8f2173e50e9adb6c97efb94f410d80ba167b74 |