美文网首页js css html
dataclass 数据封装

dataclass 数据封装

作者: alue | 来源:发表于2022-07-20 22:03 被阅读0次

在 python 中使用 dateclass 来封装数据,除了显得 Pythonic 之外,开发体验也非常好。

dateclass 非常适合这样的场景:已知接口 json 数据格式,但这个格式嵌套层级较多,如下图所示,父字段还有自己子字段的格式。

API格式

这时候,很多人会首先想到用 python 字典作为数据容器,然后循环向列表字段中 append 数据,而这些要 append 的数据,本身也可能是字典,可能还需要循环 append 各种固定格式的数据。coding 的认知负担会随着嵌套层级的增大而指数增加,而且,字典封装的数据,IDE 无法给出字段提示,无法用 . 操作符,只能用丑陋的 data['solutions'] 这种方式来访问数据,编码效率低,容易犯错。

另外一些人可能会用 class 来封装数据,但想到每个 class 都需要手写冗长的 __init__(self,xxx) 方法,我就头疼。另外,接口最终还是需要转成 json 数据格式,因此在收尾阶段,我们还需要手动处理 class 对象到 json 数据的转换,也麻烦。

这时候的最佳方案就是用 dateclass,代码精简,可读性高。
以上图为例,我们先对每种固定格式的字段,分别建立一个 dateclass 类型与之对应。

from dataclasses import dataclass, asdict

@dataclass  
class Supply:  
    goods: int  
    amount: int  
  
  
@dataclass  
class Visit:  
    node: int  
    delivery: list[Supply]  
    time: int  
  
  
@dataclass  
class VehicleRoute:  
    vehicle: int  
    route: list[Visit]  
  
  
@dataclass  
class Plan:  
    start: int  
    solutions: list[VehicleRoute]

然后再做数据填充的时候,就能够得到 IDE 的类型提示和字段提示,不容易犯错。

更方便的一点是,dataclass 提供了 asdic() 方法,能够直接将 dataclass 对象转换为字典类型。即使是各种 dataclass 复杂嵌套的情形,也能够一行代码生成最终 API 所需要的 json 数据。

import json
plan = Plan(start=self.start, solutions=self.solutions)
# 转为json格式
data_json = json.dumps(asdict(plan))

总结

dataclass 封装数据,具有代码精简、可读性强、字段提示、类型检查、一键转json等突出优势,非常适合做接口数据的封装。

相关文章

网友评论

    本文标题:dataclass 数据封装

    本文链接:https://www.haomeiwen.com/subject/ibpyirtx.html