创建动态Python字典引用路径
动态创建Python字典路径以循环并验证值时遇到问题。以下是我想做的: 使用Requests 1.0进行API调用,并将JSON响应存储在dict中创建动态Python字典引用路径,python,loops,dictionary,reference,concatenation,Python,Loops,Dictionary,Reference,Concatenation,动态创建Python字典路径以循环并验证值时遇到问题。以下是我想做的: 使用Requests 1.0进行API调用,并将JSON响应存储在dict中 response = requests.get(path/to/file.json).json() 响应对象的格式如下: { "status": "OK", "items": [ { "name": "Name 1", "id": 0, "address":{
response = requests.get(path/to/file.json).json()
响应对象的格式如下:
{
"status": "OK",
"items": [
{
"name": "Name 1",
"id": 0,
"address":{
"city": "New York",
}
},
{
"name": "Name 2",
"id": 1,
"address":{
"city": "New York",
}
},
{
"name": "Name 3",
"id": 2,
"address":{
"city": "New York",
}
}]
}
将响应dict、字段和值发送给函数进行验证。函数将获取响应对象并将字段条目附加到该对象以定义其路径,然后根据该值进行验证。所以理论上应该是:
response[field] = value
我为此编写的代码是:
def dynamic_assertion(response, field, value):
i = 0
stations = "response['items']"
count = len(response['items'])
while i < count:
path = '%s[%s]%s' % (stations, i, field)
path = path.strip("")
if path != value:
print type(path)
return False
i += 1
return True
dynamic_assertion(response, "['address']['city']", "New York")
def dynamic_断言(响应、字段、值):
i=0
stations=“响应['items']”
计数=len(响应['items'])
当我数的时候:
路径=“%s[%s]%s%”(站点、i、字段)
路径=路径带(“”)
如果路径!=价值:
打印类型(路径)
返回错误
i+=1
返回真值
动态_断言(响应,“['address']['city']”,“newyork”)
我意识到,一旦我创建了路径字符串,它就不再是一个对象。如何创建它,使我能够保留响应对象并附加要遍历的引用路径?这可能吗 我认为最好避免使用单个
路径
字符串,而使用表示嵌套字典中各个键的元组或字符串列表。也就是说,您将传递(“地址”、“城市”)
,而不是“['address']['city']”作为字段
参数。然后,您只需要一个循环来遍历键,看看最终值是否正确:
def dynamic_assertion(response, field, value):
for item in response["items"]:
for key in field:
item = item[key] # go deeper into the nested dictionary
if item != value:
return False # raising an exception might be more Pythonic
return True
示例输出(给出了问题的回答
dict):
谢谢这完全有道理。我是如此着迷于试图建立一条路一次,我甚至没有考虑这种迭代技术。简单的天才!再次感谢!
>>> dynamic_assertion(response, ("address", "city"), "New York")
True
>>> dynamic_assertion(response, ("address", "city"), "Boston")
False
>>> response["items"][2]["address"]["city"] = "Boston" # make response invalid
>>> dynamic_assertion(response, ("address", "city"), "New York")
False
>>> dynamic_assertion(response, ("address", "city"), "Boston")
False