源码地址:https://github.com/Shadow-linux/ex_dataclass
0 前言
- 对于 python 无论是新手还是老鸟在维护 python 代码的时候都会遇到一个绕不开的问题,那就是对一些字典数据模型的处理会经常不明确处理其类型,或有更甚者不明确其字段的。本文将介绍一个新的 python库来帮助读者解决该问题。
1 什么是 ex-dataclass?
- 它是一款用于降低维护成本和提高开发效率的数据管理对象,它是基于
dataclass
开发的。;-
简单看看它是如何降低维护成本,只要你会简单的类语法即可实现;
- 传统写法
# 传统写法,各种复杂的字段,甚至可能会有嵌套字段 # 给定一段数据 data = { "user_id": 1, "username": "zhangsan", "age": 18, "gender": "male", "details": { "address": "xxxx", "phone": "1234567890", }, } # 这样的取值方式,特别难记忆;而且再参数传递过程里经过一系列动作后, # 使得数据模型难以准确得知,导致维护和开发成本大大提高; user_id = data['user_id'] age = data['age] phone = data['details']['phone']
- ex-dataclass 数据对象
from ex_dataclass import ex_dataclass, filed # 预先定义好数据模型,后面找起来就有根据 @ex_dataclass class UserDetail: # 这种冒号后面带类型是python3.5之后就有的了 # field 是为这个字段提供默认值,支持 default=0 给定默认值,default_factory=int 给定一个可调用的类型 phone: str = field(default_factory=str) address: str = field(default_factory=str) @ex_dataclass class User: user_id: int = field(default_factory=int) username: str = field(default_factory=str) age: int = field(default=18) gender: str = field(default="male") details: UserDetail = field(default_factory=UserDetail) # 给定一段数据 data = { "user_id": 1, "username": "zhangsan", "age": 18, "gender": "male", "details": { "address": "xxxx", "phone": "1234567890", }, } # 将数据直接转成容易管理的数据对象,这样就算经历多次的传递也不会乱套 u = User(**data) # 当然也可这样去填充,如: # u = User(user_id=1, age=20 details=UserDetail(phone="xxx", address="xxx")) # 下面的所有写法,IDE 都会进行提示非常的友好 print(u.user_id) print(u.age) print(u.details.phone)
-
1.1 背景
1.1.1 诞生
-
从上面的简单例子可以看出 ex-dataclass 的出发点就是为了解决 python 中数据模型非常难以维护的问题,这个问题在稍微大点的项目中都让人非常的头疼。其实在早前官方推出过 dataclass 和 typing 两个内置库来解决这个难题,但效果不明显,甚至很多人都完全不知道。最重要的是 dataclass 难以满足日常需求。 如果你提到这样写 python 会把代码写复杂了,但其实你明确了数据结构后开发效率只会翻倍提升。
-
自我们在生产环境上开始使用ex-dataclass,当代码在review 或者排障的时候再也没有去担忧数据结构变动或者数据模型不明确的问题。于是我们便有了重构并开源该项目的想法,让这个项目变成开发 Python 时的日常使用库。
-
下面看看 ex-dataclass 对数据模型转换为数据对象的能力。
2 使用文档
2.1 简介
-
ex-dataclass 是通过注解类型的协助把字典数据转换成数据对象;如 str,int,typing.List 等;
-
更多的介绍可以到仓库去看看,在 example 中有大量的样例;[源码地址](https://github.com/Shadow-linux/ex_dataclass
-
支持的类型注解
- int
- str
- float
- bool
- dict
- list
- typing.Dict
- typing.List
- typing.Union
- typing.Type
- ex_dataclass cover的类型
- 功能
- 支持
ex_dataclass
类型继承的正反解析; - 支持
typing.List
中ex_dataclass
类型正反解析; - 支持
typing.List
嵌套正反解析,如:{a: [[{a:1, b:2}, {a:3, b:4}]]}
; - 支持
typing.Union
和typing.Type
特殊容器类型注解的多态行为,精确匹配字段存在最多ex_dataclass
类; - 支持反向解析下存在冗余字段,并且抛弃该字段
- 支持typing.Union 和 typing.Type 特殊容器类型相互嵌套场景 ;
- 支持纯净的class类型的正反转换解析;
- 支持
ex_dataccass
字段检测校验,通过类型注解获取类后进行值的校验;
2.2 快速开始
- 安装
pip install ex-dataclass
- 因为 ex-dataclass 与 python 的类型注解、typing模块息息相关,可以通过该文章快速入门 typing模块介绍 或 官方文档
2.2.0 示例1(转化)
import typing
from ex_dataclass import ex_dataclass, field, asdict, EXpack
@ex_dataclass