2015-03-31 2 views
0

Мне нужно написать функцию (вид флака), которая проверит несколько условий запроса и вернет сообщение на основе этих тестов.Есть ли способ «разбить» или «продолжить» в функции Python?

Например ...

def index(): 
    test1result = test1(request.form['data']) 
    if not test1result: 
     message = 'Failed test 1' 

    test2result = test2(request.form['data']) 
    if not test2result: 
     message = 'Failed test 2' 

    test3result = test3(request.form['data']) 
    if not test3result: 
     message = 'Failed test 3' 

    return render_template('index.html', message = message) 

Если первое испытание терпит неудачу, я не хочу, чтобы второй или третий тест для запуска и перезаписать мое сообщение. Моя первая мысль заключалась в том, чтобы вставить оператор return в каждый из блоков IF, но это кажется беспорядочным.

+5

использование 'else' ..... –

+2

Это совсем не грязно. Используйте 'return'! –

+2

Я думаю, что лучший способ - взять книгу и изучить основы – CY5

ответ

1

Вы можете использовать elif.

Первый запуск всех тестов, а затем if-elif блок

def index(): 
    test1result = test1(request.form['data']) 
    test2result = test2(request.form['data']) 
    test3result = test3(request.form['data']) 
    if not test1result: 
     message = 'Failed test 1' 
    elif not test2result: 
     message = 'Failed test 2' 
    elif not test3result: 
     message = 'Failed test 3' 

    return render_template('index.html', message = message) 
2

Вы должны в этом случае либо использовать elif, чтобы вступать в ваши последующие тесты только в том случае, если первый тест не прошел, или просто return. Но вы также можете сделать это:

def index(): 
    messages = [] 
    test1result = test1(request.form['data']) 
    if not test1result: 
     message.append('Failed test 1') 

    test2result = test2(request.form['data']) 
    if not test2result: 
     message.append('Failed test 2') 

    test3result = test3(request.form['data']) 
    if not test3result: 
     message.append('Failed test 3') 

    return render_template('index.html', messages=messages) 

И есть свой вид дисплея все сообщения об ошибках.

2

Моя первая мысль заключалась в том, чтобы вставить оператор возврата в каждый из блоков IF, но это кажется беспорядочным.

Не, если вы делаете небольшой рефакторинг:

def index_message(): 
    test1result = test1(request.form['data']) 
    if not test1result: 
     return 'Failed test 1' 

    test2result = test2(request.form['data']) 
    if not test2result: 
     return 'Failed test 2' 

    test3result = test3(request.form['data']) 
    if not test3result: 
     return 'Failed test 3' 

    return '......' 

def index(): 
    message = index_message() 
    return render_template('index.html', message = message) 

В качестве альтернативы вы можете использовать else и elif, чтобы избежать дальнейшей обработки.

Если у вас есть больше тестов, добавьте их в структуру данных (например: list) и используйте цикл. Не повторяйте код.

0

Используйте цикл.

def index(): 
    tests = [test1, test2, test3] 
    for i, test in enumerate(tests, 1): 
     if not test(request.form['data']): 
      return render_template('index.html', message="Failed test %s" % i) 
Смежные вопросы