2014-10-09 2 views
-3

Я создал некоторые функции, которые возвращают 1, если все прошло хорошо и 0, если была ошибка. Теперь мне нужно выполнить каждую из этих функций в определенном порядке и проверить возвращаемые значения. Если один из них возвращает 0, мне нужно немедленно перезагрузить, не вызывая никаких последующих функций.Один другой для нескольких условий, если условия

Я намеревался использовать несколько if сек, но с одним else:

if function_1(): 
    if function_2(): 
     if function_3(): 
      print "Everything went well" 
else: 
    reboot() 

, но он не работает, как я хочу: Я хочу, чтобы else часть должна быть выполнена сразу после любого из этих условий терпит неудачу, и теперь он выполняется, только если function_1 не работает.

+0

возбудит исключение внутри функции, если есть ошибка ; он будет распространяться полностью, и если вы поймаете его на внешнем уровне, вы можете решить перезагрузиться. – Evert

+8

Вы хотите, чтобы все функции всегда запускались или вы хотите немедленно перезагрузиться, если какой-либо из них не работает? – aruisdante

+0

Почему существует '[tag: linux]'? Вы также хотите знать, как выполнить перезагрузку в Python? –

ответ

7

Существует два способа сделать это.

1). Вы можете использовать один оператор if, и and условия вместе. Это приведет к поведению «короткого замыкания», поскольку оно будет продолжаться через функции до тех пор, пока первая не завершится с ошибкой, тогда ни одно из оставшихся не будет выполнено.

if function_1() and function_2() and function_3(): 
    print "Everythings went well" 
else: 
    Reboot 

2) Если вы хотите, чтобы все выполнить, вот метод, хотя он более громоздкий .:

successful = True 

successful = successful and function_1() 
successful = successful and function_2() 
successful = successful and function_2() 

if successful: 
    print "Everythings went well" 
else: 
    Reboot 
+3

Это будет работать, если вы хотите, чтобы поведение короткого замыкания на какой-либо из функций не срабатывало, но не нужно, если вам нужно gaurentee, чтобы вызывалась каждая функция. – aruisdante

+2

Не уверен, почему это получило нижний предел - похоже, что эти решения такие же, как и OPs - даже в отношении сокращения. –

+1

Это, безусловно, то, что я сделал бы. Не уверен, почему нисходящий. –

2

Вы могли бы сделать список:

functions = [function_1(), function_2(), function_3()] 

затем проверить все из них:

if all(functions): 
    print 'OK' 
else: 
    Reboot 

Таким образом, вы запускаете (при условии, что это требование), и проверить, все ли они истинны.

Предполагая, что все функции проходят:

In [1]: functions = [True, True, True] 

In [2]: all(functions) 
Out[2]: True 

Или, если один не удается:

In [3]: functions = [True, True, False] 

In [4]: all(functions) 
Out[4]: False 
+0

Почему вы называете первые два, а не третье? Если вы вызываете функции при построении кортежа, они будут выполняться независимо от результатов или предыдущих функций. Если нет, вам нужно немного больше работы, чтобы называть их. –

+0

@WilliamPursell Упс - опечатка! Cheers GreenAsJade –

+0

@Cyber ​​Нет, но выполнение их всех и сохранение результатов в списке (что это делает) –

4

Можно получить короткое замыкание поведение, которое вы хотите (прыжки непосредственно к статье else как только любая из ваших функций возвращает False) более компактным способом с all():

Давайте создадим некоторые фиктивные функции для d Цели emonstration:

def function_1(): 
    print("first") 
    return True 

def function_2(): 
    print("second") 
    return False 

def function_3(): 
    print("third") 
    return True 

... теперь, с этим кодом:

functions = [function_1, function_2, function_3] 

if all(f() for f in functions): 
    print("all good") 
else: 
    print("oh no!") 

... мы получаем следующий вывод:

first 
second 
oh no!