Как вернуть bool при итерации списка узлов?

#python

#python

Вопрос:

У меня есть приведенный ниже код, который выполняет следующие действия:

  • Получить список всех узлов (ip_addresses) из catalog_url .
  • Повторите список узлов и создайте config_url для каждого ip_address.
  • Получите данные json для каждого ip_address и проверьте, есть ли в json определенные вещи, и на основе этого распечатайте материал.

Ниже приведен мой метод, который делает это:

 def verify( config_url, catalog_url, config, action ):
    flag = False
    response = requests.get(catalog_url)
    json_array = json.loads(response.content)
    for x in json_array:
        ip = x['IPAddress']
        # get data for each ip_address
        response = requests.get(config_url.format(ip))
        data = json.loads(response.content)
        # check data for each ip_address
        if(action == 'push' and data['latestCfg'] == config):
            print(ip   " downloaded successfully")
        elif(action == 'check' and data['procCfg'] == config):
            print(ip   " verified successfully")
 

Постановка задачи

Теперь мне нужно вернуть логическое значение из моего приведенного выше метода. Если какой-либо одной машине не удается загрузить или успешно пройти проверку, мне нужно вернуть false, иначе я верну true из моего описанного выше метода. Я не понимаю, как это сделать в моем приведенном выше методе с настройкой, которая у меня есть в настоящее время?

Комментарии:

1. могу ли я с уверенностью предположить, что если data['latestCfg'] != config или data['proctCfg'] != config , то оно должно возвращать false?

Ответ №1:

Используя amp; оператор or and booelan , вы можете получить False , есть ли какой-либо операнд False .

 >>> True amp; True
True
>>> True amp; False
False

# or using `and`

>>> True and True
True
>>> True and False
False
 
  • Начните с True флага.
  • накапливать флаг с помощью amp;=
 def verify(config_url, catalog_url, config, action):
    flag = True
    response = requests.get(catalog_url)
    json_array = response.json()
    for x in json_array:
        ...
        if action == 'push':
            flag amp;= data['latestCfg'] == config
        elif action == 'check':
            flag amp;= data['procCfg'] == config
        # If you want to stop as soon as operation fail
        # if not flag:
        #     break
    return flag
 

ПРИМЕЧАНИЕ: вы можете заменить json.loads(response.content) на response.json()

Комментарии:

1. Ааа. это отличный трюк. Я не знал об этом. Кроме того, если у меня есть более одного подобного условия if(action == 'push' and "isTest" in data and data['isTest'] and "latestCfg" in data and data['latestCfg'] == config): , то как я могу это использовать amp;= ?

2. if action == 'push': flag amp;= "isTest" in data and data['isTest'] and "latestCfg" in data and data['latestCfg'] == config

3. так что в основном непосредственно перед этим я могу его добавить. теперь это имеет смысл. позвольте мне также подробнее прочитать об этом.

4. разве не просто просто установить флаг в False один раз, когда происходит сбой. Это намного проще, чем переключать флаг взад и вперед.

5. @JoeFerndz, Ты прав. 🙂 Кстати, после переключения на False , flag не будет возврата True .

Ответ №2:

Вы можете установить флаг в True перед входом в цикл. Если загрузка или проверка завершились неудачно, вы можете установить флаг в False. В конце верните флаг.

Хитрость заключается в том, чтобы установить флаг в True перед входом в цикл. Затем переключить флаг на False при возникновении сбоя. Если вы установите флаг в False один раз, он останется False для остальной части цикла, даже если все остальные элементы были успешными. Таким образом, вы знаете, что у вас произошел сбой одного из них. Если вы хотите выйти из цикла и вернуться, тогда верните False . Это выйдет из цикла и вернет False .

Вот как вы можете это сделать.

 def verify( config_url, catalog_url, config, action ):
    flag = True #set to True and flip to False inside the loop when if statement fails
    response = requests.get(catalog_url)
    json_array = json.loads(response.content)
    for x in json_array:
        ip = x['IPAddress']
        # get data for each ip_address
        response = requests.get(config_url.format(ip))
        data = json.loads(response.content)
        # check data for each ip_address
        if(action == 'push' and data['latestCfg'] == config):
            print(ip   " downloaded successfully")
        elif(action == 'check' and data['procCfg'] == config):
            print(ip   " verified successfully")
        else:
            flag = False #set to False if above two if statements fail
    return flag #if flag got set to False even once, it will return False, else it will return True
 

Ответ №3:

может быть, так?

 def verify( config_url, catalog_url, config, action ):
    flag = True
    response = requests.get(catalog_url)
    json_array = json.loads(response.content)

    for x in json_array:
        ip = x['IPAddress']

        # get data for each ip_address
        response = requests.get(config_url.format(ip))
        data = json.loads(response.content)

        # check data for each ip_address
        if action == 'push':
            if data['latestCfg'] == config:
                print(ip   " downloaded successfully")
            else:
                flag = False
        elif action == 'check':
            if data['procCfg'] == config:
                print(ip   " verified successfully")
            else:
                flag = False
    return flag