创建动态Python字典引用路径

创建动态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":{

动态创建Python字典路径以循环并验证值时遇到问题。以下是我想做的:

使用Requests 1.0进行API调用,并将JSON响应存储在dict中

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