Python Keyerror 即使密钥存在

问题描述 投票:0回答:3

下面是我编写的一个函数,用于使用 requests 库从 url 中获取特定值。这个想法是返回值名称和值唯一 ID(如果存在),否则说明它不存在。

在 try 部分下,单词 bcc 会存储一个字典(这是一个 json 输出)。字典看起来像这样

{'records': [{'uuid': '1cbb7288-b828-11e9-a419-11a032324a29', 'name': '1234_192.168.6.144/24'}, {'uuid': 'c523ef30-b823-1123-a619-00avaei7a29', 'name': '1342_172.26.41.10/28'}], 'num_records': 2}

无论如何,我不断收到以下 KeyError。该密钥确实存在,当我在 python 提示符下手动测试运行它时,它工作正常。但是当我将它从文件导入另一个函数下的另一个 python 文件时不起作用。

如果有人能帮助我了解这里发生的事情,请感激不已。

>>> from filers import NC
>>> NC.broadcastcheck(cluster,'1243',headers)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/user/python/filer.py", line 65, in broadcastcheck
    def broadcastcheck(cluster, vlan, headers):
KeyError: 'num_records'

这是我写的函数。

   def broadcastcheck(cluster, vlan, headers):
      url = 'https://'+cluster+'/api/ethernet/broadcast-domains'
      pattern = re.compile(r'^[^_]+(?=_)')
      try:
         bcc = requests.get(url,headers=headers,verify=False).json()
         for i in range(bcc['num_records']):
            bcdname = bcc['records'][i]['name']
            bcduuid = bcc['records'][i]['uuid']
            matches = pattern.finditer(bcdname)
            for match in matches:
               return "present",bcdname,bcduuid if match.group(0) == vlan else "notpresent"
      except requests.exceptions.HTTPError as error:
         print(str(error))
         sys.exit(1)
python-3.x function keyerror
3个回答
0
投票

您应该检查“.json()”的返回。它可能会将结果放入名为“数据”的对象中。


0
投票

对此我感到很抱歉。看来 API 链接是问题所在。它没有返回预期值。现在可以了并且可以正常工作。


0
投票

我遇到了同样的问题,在我的例子中,我从 API 响应中提取数据,API 接收两个参数是 page_num 和 per_page,我将页数设置为 1-10 范围,每页设置为 10000,当循环得到一个空响应“假设在第 10 页我们没有数据”,出现错误,我通过在尝试读取我期望的密钥之前检查响应长度来解决它。

© www.soinside.com 2019 - 2024. All rights reserved.