使用 Pydantic 描述层次数据结构

"""结构化数据模型处理

基于 Pydantic 的 BaseModel 构建的结构化层次模型,可以用于描述层次关系数据结构
与嵌套字典的区别:
    可以通过点号访问属性
    自动参数验证
"""
from typing import Union, List, Optional

from pydantic import BaseModel, FilePath, AnyUrl, Field


def _save(filename, data):
    with open(filename, "w", encoding='utf-8') as fp:
        fp.write(
            data
        )


class SharedModel(BaseModel):
    name: str
    icon: Optional[Union[FilePath, AnyUrl]] = None
    desc: str = Field("")


class Item(SharedModel):
    link: AnyUrl | str


class Group(SharedModel):
    items: List[Item]

    def save(self, filename):
        _save(filename, self.json(ensure_ascii=False))


class Collection(BaseModel):
    name: str
    groups: List[Group] = Field(default_factory=list, description="项目合集")

    def save(self, filename):
        _save(
            filename,
            self.json(ensure_ascii=False, indent=4)
        )

    def __iter__(self):
        """迭代所有分组
        :return: Group
        """
        for group in self.groups:
            yield group

    def __getitem__(self, group_name):
        for group in self.groups:
            if group.name == group_name:
                return group
        raise KeyError(f"Not find {group_name} in Collection({self.name})")


collection = Collection(name="收集", groups=[
    Group(name="Abc", desc="bbq", items=[
        Item(name="setuptools", desc="打包工具", link="https://peps.python.org/pep-0518/#toml")
    ])
])


if __name__ == '__main__':
    collection.save("abc.json")
    new_collection = Collection.parse_file("abc.json")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值