美文网首页js css html
Python dataclass的可选字段

Python dataclass的可选字段

作者: alue | 来源:发表于2023-01-13 19:21 被阅读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}

相关文章

网友评论

    本文标题:Python dataclass的可选字段

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