【问题标题】:Handle missing keys in python dictionary处理python字典中缺少的键
【发布时间】:2023-03-22 19:21:01
【问题描述】:

我正在 Amazon 中构建 EC2 实例列表。我正在测试字典中是否存在名为 PrivateIpAddress 和 PublicIpAddress 的键。在某些情况下,两个键都不存在,我得到一个异常:

-------------------------------------
Instance ID: i-86533615
Type: m4.xlarge
State: stopped
Private IP: 10.1.233.18
Traceback (most recent call last):
  File ".\aws_ec2_list_instances.py", line 43, in <module>
    print(Fore.CYAN + "{0}: {1}".format(key, instance[key]))
KeyError: 'Public IP'

我的代码说:

for instance in reservation["Instances"]:
if 'PrivateIpAddress' in instance and 'PublicIpAddress' in instance:
    ... do stuff...
elif 'PrivateIpAddress' in instance:
else:
    ...do stuff..

但最后一个 else 并没有发现实例没有公共 IP 地址或私有 IP 地址的问题。

这里是python中的完整代码:list ec2 instances

【问题讨论】:

  • 你可以使用reservation.get("Instances",default value here)。例如reservation.get("Instances",[])
  • 所以,以防万一这是您被难住的地方:您可以添加另一个 elif,它会检查“PublicIpAddress”,您不仅限于 1 个 elif。话虽如此,这可以通过getsetdefault 方法更清晰地完成,如您所见。
  • 有几种方法可以处理这个问题。您可以在调用它们之前主动检查字典中的键,方法是执行 if 'Public IP' in instance.keys() 之类的操作,或者使用 .get 并提供默认值,或者,如果您想过度使用,请使用 DefaultDict: @ 987654322@
  • 您的回溯表明错误在 `print(Fore.CYAN + "{0}: {1}".format(key, instance[key]))` 中,但这不包括在您提供的代码。

标签: python boto


【解决方案1】:
for instance in reservation.get("Instances", []):
    private_ip_address = instance.get("PrivateIpAddress" , None)
    public_ip_address = instance.get("PublicIpAddress" , None)
    if  private_ip_address and public_ip_address:
    ... do stuff...
    elif private_ip_address:
       ...do stuff.. 
    else:
       ...do stuff..

试试这个

【讨论】:

    【解决方案2】:

    我发现您的逻辑存在根本问题。您正在遍历所有实例并在 ec2info 中为每个实例构建地图。但是每次通过循环时,在处理特定实例时,您都会遍历 ec2info 中的所有数据,包括由循环的先前迭代添加的数据。我敢打赌,你真的不想这样做。我敢打赌,您真的想只显示您正在处理的实例的属性。

    这是解决问题的关键:

    attributes = ['Instance ID', 'Type',
        'State', 'Private IP', 'Launch Time' ]
    for instance_id, instance in ec2info.items():
    

    所以在这里,您正在遍历 ec2info 中的所有地图,但您正在应用一组特定于您当前正在处理的一个实例的“属性”。一般来说,根据您自己的代码,并非 ec2info 中的所有映射都具有所有相同的键,因此您会遇到错误。

    【讨论】:

      猜你喜欢
      • 2017-05-20
      • 1970-01-01
      • 2021-11-03
      • 2023-02-14
      • 2022-10-13
      • 2019-05-09
      • 1970-01-01
      • 2021-08-27
      • 2021-07-30
      相关资源
      最近更新 更多