Тестирование нескольких условий в Python - PullRequest
0 голосов
/ 07 марта 2019

Я получаю список экземпляров aws ec2 с помощью этой команды:

response = ec2.describe_instances()
for reservation in response["Reservations"]:
    for instance in reservation["Instances"]:

Мне нужно посмотреть, есть ли у каждого экземпляра частный IP и публичный IP.Если я использую оператор try для обоих, я получаю синтаксическую ошибку:

try instance['PrivateIpAddress']  and instance['PublicIpAddress']:

Это ошибка:

File ".\aws_ec2_list_instances.py", line 26
    try instance['PrivateIpAddress']  and instance['PublicIpAddress']:
               ^
SyntaxError: invalid syntax

Если я использую оператор if вместо try, python жалуетсячто ключ не существует, если у машины нет общедоступного IP-адреса:

if instance['PrivateIpAddress'] and instance['PublicIpAddress']:

Я получаю эту ошибку:

Traceback (most recent call last):
  File ".\aws_ec2_list_instances.py", line 26, in <module>
    if instance['PrivateIpAddress'] and instance['PublicIpAddress']:
KeyError: 'PublicIpAddress'

Как правильно поступить?

Ответы [ 2 ]

2 голосов
/ 07 марта 2019

Вы должны проверить if ключом является in словарь:

if 'PrivateIpAddress' in instance and 'PublicIpAddress' in instance:

Обратите внимание, что это будет просто проверить, присутствуют ли эти ключи в словаре, но не если они имеют значимыйзначение, например, в зависимости от того, как вы получаете ваши данные, они могут быть None или пустые строки "".В качестве альтернативы, вы также можете использовать get для получения значений или None, если они отсутствуют.

if instance.get('PrivateIpAddress') and instance.get('PublicIpAddress'):

Здесь значения неявно интерпретируются как bool, то есть оба None(или не присутствующие) и пустые строковые значения будут считаться False.

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

Try операторы используются для захвата различных исключений, таких как KeyError. Вы бы использовали их как таковые:

try:
    if instance['PrivateIpAddress'] and instance['PublicIpAddress']:
        # do something
except KeyError:
        # do something else
...