Светлячный Dev Лог

Mon 18 April 2011

For-Else in Python

Tags: python

Пользовались ли вы когда-нибудь ключевым словом else, совместно с for? Нет? Мне тоже не приходилось. А оказывается, это чрезвычайно удобно в тех случаях, когда в теле цикла используется ключевое слово break.

Как работает else? Очень просто. Код этой секции выполняется в том случае, если основной цикл завершился естественным образом, без эксепшена или вызова break.

То есть, это ключевое слово будет полезно тогда, когда вам нужно выполнить какой-то код только в том случае, если в цикле были перебраны все элементы. Я на этом сделал аналог switch с поддержкой регекспов и значением по-умолчанию:

import re
REGEXES = (
    (r'some ([^ ]+)', lambda m, line: do_some(m, line)),
    (r'another ([^ ]+)', lambda m, line: do_another(m, line)),
)
REGEXES = tuple((re.compile(line), func) for line, func in REGEXES)

def switch(text_to_check, regexes, default):
    for line, func in regexes:
        match = line.match(text_to_check)
        if match is not None:
            func(match, line)
            break
    else:
        default(line)

switch('blah minor', REGEXES, do_default_action)

Comments !