Skip to main content

python package dataclass utils

Project description

datclass

python package datclass

install

pip install -U datclass
pip install git+ssh://git@github.com/foyoux/datclass.git
pip install git+https://github.com/foyoux/datclass.git

basic usage

Example 1
from dataclasses import dataclass, field
from typing import Dict, List

from datclass import DatClass


@dataclass
class User(DatClass):
    name: str = None
    age: int = None


@dataclass
class Group(DatClass):
    name: str = None
    users: List[User] = field(default_factory=list)
    meta: Dict = field(default_factory=dict)


if __name__ == '__main__':
    dat = {
        'name': 'foyoux',
        'users': [
            {'name': 'foyou', 'age': 18}
        ],
        'meta': {
            'field1': 'value1',
            'field2': 'value2',
            'field3': 'value3',
        },
    }

    group = Group(**dat)

    print(group.name, group.meta)
    for user in group.users:
        print(user.name, user.age)
Example 2

Example 1 中,如果将修改 dat

dat = {
    'name': 'foyoux',
    'users': [
        {'name': 'foyou', 'age': 18, 'sex': 'female'}
    ],
    'meta': {
        'field1': 'value1',
        'field2': 'value2',
        'field3': 'value3',
    },
}

程序将会抛出 TypeError: User.__init__() got an unexpected keyword argument 'sex' 错误,原因就是定义的字段少于实际给出的

解决这个问题的办法设置 metaclass,新代码如下

from dataclasses import dataclass, field
from typing import Dict, List

from datclass import DatClass, MetaClass


@dataclass
class User(DatClass, metaclass=MetaClass):
    name: str = None
    age: int = None


@dataclass
class Group(DatClass, metaclass=MetaClass):
    name: str = None
    users: List[User] = field(default_factory=list)
    meta: Dict = field(default_factory=dict)


if __name__ == '__main__':
    dat = {
        'name': 'foyoux',
        'users': [
            {'name': 'foyou', 'age': 18, 'sex': 'male'},
            # {'name': 'foyou', 'age': 18},
        ],
        'meta': {
            'field1': 'value1',
            'field2': 'value2',
            'field3': 'value3',
        },
    }

    group = Group(**dat)

    print(group.name, group.meta)
    for user in group.users:
        print(user.name, user.age)

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

datclass-0.0.3.tar.gz (3.6 kB view hashes)

Uploaded Source

Built Distribution

datclass-0.0.3-py3-none-any.whl (4.1 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page