#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