Как элегантно обрабатывать несколько операторов continue внутри цикла for - PullRequest
3 голосов
/ 30 октября 2019

Я работал над рефакторингом всей кодовой базы для одного из проектов. В основном модульный код в отдельные модули, классы с одной обязанностью, разбивка функции спагетти на маленькие маленькие методы и т. Д.

Однако я хочу знать, как мы можем аккуратно / элегантно обрабатывать приведенный ниже блок кода, который имеет кратно, если условия с операторами продолжения . Идея состоит в том, чтобы сделать его меньшим и чистым. В других случаях я использую предикат везде, где нахожу несколько операторов if-и . Но здесь ситуация немного отличается, так как они печатают разные сообщения журнала с учетом различных условий.

def somefunc(*args, **kwargs):
    for p_key, p_det in somedict.iteritems():

            get_all_somevars(p_det)

            if somevar1 and somevar2 is None:
                continue

            if somevar3 is None:
                logger.info('some message')
                continue

            if somevar4 is None:
                logger.info('some message')
                continue

            somevar5 = x.split('\n')
            somevar6 = y.split('\n')

            somevar7 = do_something_2(somevar5, somevar6)


            if somevar7 is None:
                logger.info('some message')
                continue

            do_something_3()

1 Ответ

2 голосов
/ 30 октября 2019

Некоторые проверки качества кода отклоняют несколько циклов продолжения (например, более 2) внутри циклов.

Когда это происходит, вы можете обернуть все эти условные выражения в отдельный метод, который будет возвращать true / false и регистрировать соответственно.

Я не знаю другого способа очистки.

Редактировать: (псевдокод)

def somefunc(*args, **kwargs):
    for p_key, p_det in somedict.iteritems():

        do_something_1()

        if should_skip_that_loop(args)
            continue

        somevar5 = x.split('\n')
        somevar6 = y.split('\n')

        somevar7 = do_something_2(somevar5, somevar6)


        if somevar7 is None:
            logger.info('some message')
            continue

        do_something_3()

def should_skip_that_loop(*args, **kwargs):
        if somevar1 and somevar2 is None:
            return True

        if somevar3 is None:
            logger.info('some message')
            return True

        if somevar4 is None:
            logger.info('some message')
            return True
        return False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...