2015-02-25 2 views
2

Я пытаюсь проверить вывод нескольких функций, и если нет ошибки, я перехожу к следующей функции. Так я добавил время цикла и мало, если операторы для обработки ошибок:Предложение If-else в инструкции Python

success = True 
    while success: 
     err, msg = function1() 
     if not err: 
      err, msg = function2() 
      if not err: 
       err, msg = function3() 
       if not err: 
        err, msg = function4() 
       else: 
        print msg 
        success = False 
      else: 
       print "function2 fails" 
       sucess = False 
     else: 
      print "function1 fails" 
      success = False 

Это лучший способ избежать, если, иначе, как я могу переделать код для этой цели?

+2

Не уверен Если вы правильно поняли, но это называется обработкой исключений: https://docs.python.org/2/tutorial/errors.html. Вы можете использовать try, кроме функций и функций, которые вы можете поднять и исключить, если возникла ошибка. – Mac

+0

Что вы хотите сделать, это заменить, где возвращаемое 'err' с помощью' raise', например 'raise RuntimeError()'. Затем заверните вызовы функций в блок «try: ... except RuntimeError: ...». – matsjoyce

+0

Использовать исключения, duh. – rightfold

ответ

3

относительно простой способ будет создать список функций и перебирать их:

functions = [function1, function2, function3, function4] 
success = True 
while success: 
    for f in functions: 
     err, msg = f() 
     # If there's an error, print the message, print that the 
     # function failed (f.__name__ returns the name of the function 
     # as a string), set success to False (to break out of the while 
     # loop), and break out of the for loop. 
     if err: 
      print msg 
      print "{} failed".format(f.__name__) 
      success = False 
      break 

Я уверен, что вы могли бы быть гораздо больше фантазии и создать пользовательский итератор, и т.д., и т.д., и т.д. (что может быть лучшим решением, если ваши фактические потребности более сложны). Но это тоже должно работать.

Если вы беспокоитесь о печати на STDERR вместо STDOUT, вы также можете использовать the warn function in the warnings module.

+1

Элегантное решение. – erip

1

Вы можете попробовать следующее:

while True: 
    for f in (function1, function2, function3, function4): 
     err, msg = f() 
     if err: 
      print("%s failed, msg is %s" % (f.func_name, msg)) 
      break 
    else: 
     break 

Он выполняет каждую функцию в последовательности. Если один из них терпит неудачу, тогда печатается сообщение msg и function, и мы разрываем оператор for. Когда мы ломаем for, else не выполняется. Итак, есть еще одно повторение вышеупомянутого цикла.

Если каждая функция успешно завершена, мы не сломаем и не выполним else из for. Это прерывается с while True, и программа продолжается нормально.