在 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等突出优势,非常适合做接口数据的封装。










网友评论