Skip to main content

A more powerful data model management than DataClass that reduces maintenance costs and improves coding efficiency.

Project description

LICENSE VERSION PYPI LANGUAGE codebeat badge

ex_dataclass 是什么?

  • 它一款继基于 dataclass 开发的 python 库,但对数据模型处理更加的友好。它通过 Python3类型注解 能轻易的处理 dict 与自定义 class 间的转换,从而明确复杂数据模型的类型,降低维护代码的压力及有效降低操作复杂数据难度。

  • 它在配合 Python3 typing 模块的特殊容器的类型注解能实现更多高级功能;

特性

  • 注解类型

  • [x] int

  • [x] str

  • [x] float

  • [x] bool

  • [x] dict

  • [x] list

  • [x] typing.Dict

  • [x] typing.List

  • [x] typing.Union

  • [x] typing.Type

  • 功能

  • [x] 支持 ex_dataclass 类型继承的正反解析;

  • [x] 支持 typing.Listex_dataclass 类型正反解析;

  • [x] 支持 typing.List 嵌套正反解析,如:{a: [[{a:1, b:2}, {a:3, b:4}]]}

  • [x] 支持 typing.Uniontyping.Type 特殊容器类型注解的多态行为,精确匹配字段存在最多 ex_dataclass

  • [x] 支持反向解析下存在冗余字段,默认行为是抛弃冗余字段(可进行配置)

  • [x] 支持typing.Union 和 typing.Type 特殊容器类型相互嵌套场景

  • [ ] 支持 ex_dataccass 字段检测校验,通过类型注解获取类后进行值的校验;

快速开始

示例 1

import typing
from ex_dataclass import ex_dataclass, asdict, field, EXPack

data = {
    "teams": [
        {
            "team_name": "Team-A",
            "users"    : [
                {
                    "name": "zhangsan",
                    "age" : 18,
                },
                {
                    "name": "lisi",
                    "age" : 18,
                }
            ]
        },
{
            "team_name": "Team-B",
            "users"    : [
                {
                    "name": "jack",
                    "age" : 18,
                },
                {
                    "name": "rose",
                    "age" : 18,
                }
            ]
        }
    ]
}


@ex_dataclass
class User:
    # default_factory: 需要给一个类(可callable)
    name: str = field(default_factory=str)
    # default: 给定一个默认值
    age: int = field(default=0)


@ex_dataclass
class Team:
    team_name: str = field(default_factory=str)
    # 没有值时,我们设置一个list给users字段
    users: typing.List[User] = field(default_factory=list)


@ex_dataclass
class AllTeam:
    teams: typing.List[Team] = field(default_factory=list)


# 看看TeamUser 接受参数或字典

all_team = AllTeam(**data)
# 可以看到运行结果,所有类型都被转换成对象,对象在python中是非常的友好可以进行全方位自动补全,并且方便维护;
print(all_team)
# AllTeam(teams=[Team(team_name='Team-A', users=[User(name='', age=18), User(name='', age=18)]), Team(team_name='Team-B', users=[User(name='', age=18), User(name='', age=18)])])
print(all_team.teams)
# [Team(team_name='Team-A', users=[User(name='', age=18), User(name='', age=18)]), Team(team_name='Team-B', users=[User(name='', age=18), User(name='', age=18)])]
print(all_team.teams[0].team_name)
print(all_team.teams[0].users)
# Team-A
# [User(name='', age=18), User(name='', age=18)]
print(all_team.teams[0].users[0].name)
# zhangsan

# 重新转回字典
print(asdict(all_team))
# {'teams': [{'team_name': 'Team-A', 'users': [{'name': 'zhangsan', 'age': 18}, {'name': 'lisi', 'age': 18}]}, {'team_name': 'Team-B', 'users': [{'name': 'jack', 'age': 18}, {'name': 'rose', 'age': 18}]}]}
  • 看完第一个示例应该能发现 ex_dataclass 对数据转换成对象,全凭的是我们在属性字段后面写的类型注解。通过这样的转换能力,我们就可以摆脱 data_dict["a"]["b"]["c"] 这样取值的复杂场景;

示例 2 * 在继承关系中 ex_dataclass

依旧能准确识别你所需要转换的类型。

@ex_dataclass
class Person:
    # default_factory: 需要给一个类(可callable)
    name: str = field(default_factory=str)
    # default: 给定一个默认值
    age: int = field(default=0)
    height: float = field(default=float)
    weight: float = field(default=float)


@ex_dataclass
class PersonDetails:
    address: str = field(default_factory=str)
    hobbies: typing.List[str] = field(default_factory=list)
    phone: str = field(default_factory=str)


# 继承person使其拥有person的熟悉
@ex_dataclass
class Male(Person):
    gender: str = field(default="male")


@ex_dataclass
class Female(Person):
    gender: str = field(default="female")


@ex_dataclass
class Jack(Male):
    # 当你默认值需要PersonDetails 对象时,可以写入到default_factory, 如果不需要则写dict或None
    details: PersonDetails = field(default_factory=PersonDetails)


@ex_dataclass
class Rose(Female):
    details: PersonDetails = field(default_factory=dict)


# 最终初始化两个人物,使用参数初始化, 这里并没有给出gender,因为已经设置默认值了
jack = Jack(
        name="jack",
        age=18,
        height=1.80,
        weight=125.0,
        details={
            "address": "xxxx",
            "hobbies": ["aa", "bb", "cc"],
            "phone"  : "123456789"
        }
)
# 使用字典初始化
rose = Rose(
        name="rose",
        age=18,
        height=1.680,
        weight=98.0,
        details={
            "address": "xxxx",
            "hobbies": ["aa", "bb", "cc"],
            "phone"  : "987654321"
        }
)
print(jack)
print(jack.details.phone)
print(rose)
print(rose.details.phone)
# Jack(name='jack', age=18, height=1.8, weight=125.0, gender='male', details=PersonDetails(address='xxxx', hobbies=['aa', 'bb', 'cc'], phone='123456789'))
# 123456789
# Rose(name='rose', age=18, height=1.68, weight=98.0, gender='female', details=PersonDetails(address='xxxx', hobbies=['aa', 'bb', 'cc'], phone='987654321'))
# 987654321
  • 若当前 ``ex_dataclass`` 库对你有帮助请给个 🌟 予以支持;

实例 3

https://github.com/Shadow-linux/ex_dataclass

更多详细用法

https://github.com/Shadow-linux/ex_dataclass

联系方式

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

ex_dataclass-1.1.1.tar.gz (19.1 kB view details)

Uploaded Source

Built Distribution

ex_dataclass-1.1.1-py3-none-any.whl (15.4 kB view details)

Uploaded Python 3

File details

Details for the file ex_dataclass-1.1.1.tar.gz.

File metadata

  • Download URL: ex_dataclass-1.1.1.tar.gz
  • Upload date:
  • Size: 19.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.6.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.1 CPython/3.7.7

File hashes

Hashes for ex_dataclass-1.1.1.tar.gz
Algorithm Hash digest
SHA256 12ecb372e4541d215ba28e3c0ce07c1aabf6d6c272e0d4848e38664e10cafa73
MD5 f18bea1439977e27d06a3d2c8c22c88c
BLAKE2b-256 4368a730d8b646a9cfe57d09b0d9c4dbcf31f624f6bb42c941fea426017dd674

See more details on using hashes here.

File details

Details for the file ex_dataclass-1.1.1-py3-none-any.whl.

File metadata

  • Download URL: ex_dataclass-1.1.1-py3-none-any.whl
  • Upload date:
  • Size: 15.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.6.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.1 CPython/3.7.7

File hashes

Hashes for ex_dataclass-1.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 ffe95bff8cfb818835def4a539dfa2884c681360cc646b357d958f8301799654
MD5 cfc9267ad592aab29ae83ddc6a7249d8
BLAKE2b-256 b7b6180ede3e7336a65a502587ee0dfea62371609d8ca1a54e5c1ee40b40431b

See more details on using hashes here.

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