Python dataclass的可选字段

内容分享1天前发布
0 0 0

Python 的 dataclass 是数据封装的好工具, 但它有个缺陷, 即无法支持可选字段.

例如给前端树形选择器提供的数据结构如下图所示

@dataclass  
class TreeSelectOptionItem:  
    id: Union[str, int]  
    label: str  
    children: Optional[List[ TreeSelectOptionItem ]] = None

其中 children 是递归自身结构的字段, 但叶子结点可以没有该字段. 而 dataclass 则无法表明这样的数据结构, 由于上面声明的结构里, children 字段是必须存在, 只能用 None 来示意.

问题是, 有的场景下 None没有该字段, 这两个情况并不等价. 例如树形选择器 Vue-Treeselect 中, children=null 表明该节点需要懒加载子节点数据. 这样, 后端的数据必须做必定的处理,才能传给前端.

如何能够优雅的解决这个问题呢? 这里给出一个解决方案:
一般, 在传给前端之前, 我们会用 asdict 方法去序列化 dataclass, 所以可以思考拦截这个方法. 这种思路的一个实现方式如下:

from dataclasses import dataclass, asdict

@dataclass  
class TreeSelectOptionItem:  
    id: Union[str, int]  
    label: str  
    children: Optional[List[ TreeSelectOptionItem ]] = None
    def as_dict(self):  
        # 先序列化
        data = asdict(self)  
        # 过滤掉是None的字段
        return {key: value for key, value in data.items() if value is not None}

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...