仅当值存在时才将键添加到字典中



我正在从返回JSON格式的API请求数据,

{
"a":"1",
"b":{
"c":{
"d":"2",
"e":"3"
},
"f":"4"
},
"g":"5",
"h":"6",
"i":"7",
"j":"8",
"k":"9",
"l":"10"
}

不幸的是,这不是我希望看到的理想格式,并且与其他一些端点不一致。我可能希望将其重新格式化为,

{
"a":"1",
"c":{
"d":"2",
"e":"3"
},
"properties": {
"f":"4",
"g":"5",
"h":"6",
"i":"7",
"j":"8",
"k":"9",
"l":"10"
}
}

我可以很容易地重新格式化它,通过创建一个函数,做这样的事情,

def format(data: dict) -> dict:
return {
"a": data["a"],
"c": data["b"]["c"],
"properties": {
"f":data["f"],
"g":data["g"],
"h":data["h"],
"i":data["i"],
"j":data["j"],
"k":data["k"],
"l":data["l"],
}
}

现在,API本身只在用户请求时返回一些属性。因此,用户可能会或可能不会请求上述properties下的某些字段,甚至这些功能可能会在未来增加或减少。

如果用户没有请求所有的属性,而只是请求一些属性,这会破坏我的代码。作为一种快速解决方案,我更改了上面的每个属性,使其相应设置

"properties": {
"f":data["f"] if "f" in data else None,
"g":data["g"] if "g" in data else None,
"h":data["h"] if "h" in data else None,
"i":data["i"] if "i" in data else None,
"j":data["j"] if "j" in data else None,
"k":data["k"] if "k" in data else None,
"l":data["l"] if "l" in data else None,
}

这个问题和以前一样-这些属性可能会在未来继续增加到可能10到20个,甚至是properties属性中的40个特征,从而变得重复。作为一个副作用,我必须在创建这个新格式后运行一个循环来删除所有值为None的键。

理想情况下,如果值存在,我希望key:value对仅成为properties的一部分的解决方案,但我无法想到一个简单或理想的python解决方案,将使这看起来像干净的代码。

我认为创建一个具有None值的内部属性的对象,然后在循环中执行删除操作是"重复的";-我基本上会创建一个字典对象,然后立即删除它的一部分,这对我来说没有意义。这应该在一个步骤中完成,而不是两个不同的代码段。我担心,在未来的开发人员意识到API的本质之前,这对他们来说可能没有明显的意义。

谢谢!

这样做的一个方法是生成字典。无论properties的个数是多少,我知道什么是永远不会出现的,即a,b,c密钥。

可以写成

`properties`: {
k:v for (k,v) in data.items() if k not in ['a', 'b', 'c'] 
}

我想这可能有用。

相关内容

  • 没有找到相关文章

最新更新