Обработка недостающих ключей в словаре Python - PullRequest
0 голосов
/ 07 марта 2019

Я создаю список экземпляров EC2 в Amazon.И я проверяю наличие ключей словаря 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..

Но последнее не решает проблему, когда экземпляр не имеетоткрытый IP-адрес или частный IP-адрес.

Вот полный код на Python: список экземпляров ec2

Ответы [ 2 ]

1 голос
/ 07 марта 2019

Я вижу фундаментальную проблему в вашей логике. Вы просматриваете все экземпляры и строите карты для каждого из них в ec2info . Но каждый раз в цикле при обработке конкретного экземпляра вы перебираете все данные в ec2info , включая данные, добавленные предыдущими итерациями цикла. Бьюсь об заклад, вы не хотите этого делать. Держу пари, вы действительно хотите отобразить атрибуты только для экземпляра, над которым вы работаете.

Вот ключ к вашей проблеме:

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

Итак, здесь вы перебираете все карты в ec2info , и все же вы применяете набор «атрибутов», характерных для одного экземпляра, который вы сейчас обрабатываете. Так как в целом, согласно вашему собственному коду, не все карты в ec2info будут иметь все одинаковые ключи, вы получаете сообщение об ошибке.

1 голос
/ 07 марта 2019
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..

Попробуйте это

...