[Python] 如何降低维护代码成本 (ex-dataclass)

ex-dataclass 是一个Python库,旨在降低代码维护成本和提高开发效率,通过注解类型将字典转换为数据对象。本文介绍了ex-dataclass的基本概念、使用方法,包括快速开始示例、进阶示例,如typing.Union和typing.Type的支持,以及一些补充用法。通过使用ex-dataclass,开发者可以更清晰地定义和管理数据结构。
摘要由CSDN通过智能技术生成

源码地址: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 中数据模型非常难以维护的问题,这个问题在稍微大点的项目中都让人非常的头疼。其实在早前官方推出过 dataclasstyping 两个内置库来解决这个难题,但效果不明显,甚至很多人都完全不知道。最重要的是 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.Listex_dataclass 类型正反解析;
  • 支持 typing.List 嵌套正反解析,如:{a: [[{a:1, b:2}, {a:3, b:4}]]}
  • 支持 typing.Uniontyping.Type 特殊容器类型注解的多态行为,精确匹配字段存在最多 ex_dataclass 类;
  • 支持反向解析下存在冗余字段,并且抛弃该字段
  • 支持typing.Union 和 typing.Type 特殊容器类型相互嵌套场景 ;
  • 支持纯净的class类型的正反转换解析;
  • 支持 ex_dataccass 字段检测校验,通过类型注解获取类后进行值的校验;

2.2 快速开始

  • 安装
pip install ex-dataclass
2.2.0 示例1(转化)
import typing
from ex_dataclass import ex_dataclass, field, asdict, EXpack

@ex_dataclass
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值