首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用getter-setter创建类,该类使用python3从json获取数据。

使用getter-setter创建类,该类使用python3从json获取数据。
EN

Stack Overflow用户
提问于 2022-03-15 16:03:16
回答 1查看 479关注 0票数 0

我正在为第三方应用程序构建一个使用REST的应用程序。当我从API中检索一个对象时,它发送给我一个json,它传递给一个内部取出键并通过类使用property提供数据的类。

示例:

有效载荷:

代码语言:javascript
复制
{
  "value":{
    "boot":{
      "delay":10,
      "legacy_boot":false
    }
  }
}
代码语言:javascript
复制
class AbstractInfo:
  def __init__(self, json):
    try:
      self.info = json["value"]
    except KeyError:
      # KeyError is raised when nested dictionary is passed which does not contain `value` key
      self.info = json

  def to_dict(self):
    return self.info

class BootInfo(AbstractInfo):

  @property
  def delay(self):
    return self.info["delay"]

  @property
  def legacy_boot(self):
    return self.info["legacy_boot"]

class MainInfo(AbstractInfo):
  @property
  def boot(self):
    return BootInfo(json=self.info["boot"])

现在,从其他一些过程中,我使用动态导入调用MainInfo类,并执行如下操作

代码语言:javascript
复制
# Do rest API call and get the payload in a variable
MainInfo(json=payload)

直到现在,这一切都很好,我只是尝试从有效负载中获取如下的值

代码语言:javascript
复制
# GetInfo does dynamic import for the correct class based on the resource_id
info = GetInfo("resource_id")
print(info.boot.delay)

现在,我的目标是使用BootInfo中定义的模式创建一个对象,以便它返回相关的dictionary

以下是打印语句的结果,以帮助澄清问题

代码语言:javascript
复制
print(MainInfo(json=json).to_dict())

{'boot': {'delay': 10, 'legacy_boot': False}}

print(MainInfo(json=json).boot.to_dict())

{'delay': 10, 'legacy_boot': False}

我想做这样的事

代码语言:javascript
复制
bi = BootInfo(delay=20, legacy_boot=True).build_dict()
print(bi)
{'delay': 20, 'legacy_boot': True}
# Then use `bi` into another place to mount the dictionary easily like building a lego set

我知道我的BootInfo不接受delaylegacy_boot作为论据。如果我添加它们,那么当数据通过json到达时,如何设置值?我觉得我现在处于一种鸡皮疙瘩的境地。而且,如果可能的话,我希望保持代码的当前结构,这样从嵌套结构中找到键的工作就更少了。嵌套结构越多,生成的类就越多。当某个键依赖于来自另一个属性的值并且在json有效负载中可能不可用时,我也在属性下进行验证。

我研究过gettersetter,尝试了一些事情,并遇到了一些问题,只是无法使我的需求发挥作用。

有没有人知道最好的方法来完成这件事,或者用一个示例代码告诉我正确的方向?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-15 16:27:05

我认为这是关于何时使用验证器库的一个主要示例。(个人最爱:https://pydantic-docs.helpmanual.io/)

优势:

  1. 您可以通过强烈键入预期的json和嵌套结构来验证通过API获取的数据。
  2. 有所有的帮助方法来将dict转换为类,并在必要时将类转换为dict,以及读取json字符串的方法。

示例:

代码语言:javascript
复制
from pydantic import BaseModel

class BootInfo(BaseModel):
  delay: int
  legacy_boot: bool

class MainInfo(BaseModel):
  boot: BootInfo


class Info(BaseModel):
  value: MainInfo

然后你就可以:

代码语言:javascript
复制
payload = {
  "value":{
    "boot":{
      "delay":10,
      "legacy_boot":false
    }
  }
}

info = Info(**data)
info.value.boot.delay
info.value.boot.legacy_boot

assert info.dict() == payload

# or init the class by properties
boot_info = BootInfo(delay=10, legacy_boot=False)
assert boot_info.delay == 10
boot_info.dict()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71485331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档