Switchboard
1.0.0
Switchboard 让 API 的使用变得简单。 Switchboard 可帮助您轻松转换 JSON 模式。通过创建总机并定义一些线路,您可以管理旧模式的哪些字段暗示新模式中的哪些字段。
Switchboard 这个名称是旧时电话接线员的协会。通过使用总机,您将充当操作员。将架构字段相互链接类似于电话接线员的总机。照片由高勒历史拍摄。
例如,在使用集成和第三方 API 时,您经常会遇到必须手动挖掘数据的情况。让我们假设您有以下类型的简单数据库模式:
Column | Type ---------------+------- first_name | string last_name | string email | string
例如,您正在使用第 3 方用户 API,它返回以下类型的有效负载:
{“id”:12335,“firstName”:“John”,“lastName”:“Doe”,“contactInfo”:{“primaryEmail”:“[email protected]” } }
那么,现在该怎么办?将有效负载转换为您自己的格式的最佳方法是什么?这看起来是不是很熟悉:
response_dict = json.loads(response.body)data = {"first_name":response_dict.get("firstName"),"last_name":response_dict.get("lastName"),"email":response_dict.get("contactInfo" , {}).get("primaryEmail") }
不幸的是,当使用嵌套 JSON 结构、多个第 3 方 API 或它们的组合时,上述解决方案变得极其混乱。这就是 Switchboard 有用的原因,通过定义新的 switchboard,您可以轻松管理不同模式之间的数据映射。
from switchboard import Switchboard, Cordclass UserSwitchboard(Switchboard):first_name = Cord("firstName")last_name = Cord("lastName")email = Cord(["contactInfo", "primaryEmail"]) # 注意访问嵌套是多么简单数据!
现在,代码看起来好多了。好的!
response_dict = json.loads(response.body)data = UserSwitchboard().apply(response_dict)
该项目仍在进行中。稍后会提供更好的文档。
定义新的总机很容易。您需要做的就是导入它,并定义一些和弦。
from switchboard import Switchboard, Cordclass MySwitchboard(Switchboard):pet_name = Cord(source="petName", # 源告诉源中的字段位置 schemarequired=True, # 如果字段为必填字段但缺失,则会引发异常default="Mr. Dog" #如果字段缺失,则使用默认值)
可以使用 Meta 类调整总机功能:
from switchboard import Switchboard, Cordclass MySwitchboard(Switchboard):class Meta:# 告诉如何处理缺失的字段。默认功能是 INCLUDE,# 这意味着如果源字段缺失,则会追加字段,但字段# 值将为 Nonemissing = Switchboard.EXCLUDE # 选项:Switchboard.EXCLUDE |总机。包括 | Switchboard.RAISEpet_name = Cord("petName")
线可以访问嵌套字段,甚至列表。
from switchboard import Switchboard, Cordclass MySwitchboard(Switchboard):target_field = Cord(source=["field1", # 匹配字段 key0, # 匹配列表索引"field2" # 匹配字段 key] )MySwitchboard().apply({ "field1": [{ "field2": "value" }] })# > { "target_field": "value" }
总机的many
属性有助于处理列表。例如:
类 MySwitchboard(Switchboard):target = Cord("source")data_in = [ {“来源”:1}, {“来源”:2}, {“来源”:3}, {“来源”:4} ]MySwitchboard(many=True).apply(data_in)# > [{ "target": 1 }, { "target": 2 }, { "target": 3 }, {"target": 4 }]