吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1803|回复: 3
收起左侧

[Python 转载] 用 python 实现一个只读的,只能有固定字段的类似结构体的特殊字典

[复制链接]
thepoy 发表于 2021-4-8 08:46
本帖最后由 thepoy 于 2021-4-8 10:57 编辑

昨天在写 metaWeblog 的时候,因为请求是固定的几个字段,但 python 中好像并没有 struct 以供使用,于是便想着简单实现一下:

class BaseStruct(dict):
    fields: Optional[Union[tuple, set, list]] = None

    def __new__(cls, *args, **kwargs):
        if not (isinstance(cls.fields, tuple) or isinstance(cls.fields, set)
                or isinstance(cls.fields, list)):
            raise AttributeError(
                "`fields` is must be instance of tuple, set, or list")
        if not set(args[0].keys()).issubset(set(cls.fields)):
            raise OverflowError(
                f"all keys of the dict object should be contained in `fields`: {cls.fields}"
            )
        return super().__new__(cls, *args, **kwargs)

    def __getattr__(self, item: str):
        if item not in self.fields:
            raise KeyError("the key `%s` not exists" % item)
        return self[item]

    def __setattr__(self, key, value):
        raise NotImplementedError('read only')

    def __setitem__(self, k, v):
        raise NotImplementedError('read only')

基类写完,下面试一下好不好用:

class BlogInfo(BaseStruct):
    fields = ["blogid", "url", "blogName", "username", "password"]

rbi = {"blogid": 1, "url": "http", "blogName": "blog"}
bi = BlogInfo(rbi)
bi
# {'blogid': 1, 'url': 'http', 'blogName': 'blog'}
bi.url
# http
bi.url = "ftp"
# NotImplementedError: read only
bi["url"] = "ftp"
# NotImplementedError: read only

rbi = {"blogid": 1, "url": "http", "blogName": "blog", "content": "It is content"}
bi = BlogInfo(rbi)
# OverflowError: all keys of the dict object should be contained in `fields`: ['blogid', 'url', 'blogName', 'username', 'password']

rbi = {"blogid": 1, "url": "http"}  # 能使用部分字段是与 namedtuple 的区别
bi = BlogInfo(rbi)
bi
# {"blogid": 1, "url": "http"}

好像可以用了。


免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
zsr849408332 + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

龍謹 发表于 2021-4-8 09:18
学习学习,谢谢楼主分享心得!
santus36 发表于 2021-4-8 10:46
 楼主| thepoy 发表于 2021-4-8 10:49
本帖最后由 thepoy 于 2021-4-8 10:54 编辑
santus36 发表于 2021-4-8 10:46
collections.namedtuple?

我之前用namedtuple,但它不能被xmlrpc序列化,而且所有字段都不能为空,就给换了。
fields里定义的是所有有效字段,但字典不需要包含全部字段。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 18:54

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表