Альтернатива последовательным блокам Try / Except - PullRequest
0 голосов
/ 28 июня 2018

Я довольно новичок в Python, поэтому мне было интересно, есть ли более краткая альтернатива для выполнения тонн последовательных try/except блоков, как можно увидеть ниже?

try:
    project_type = body.find_element_by_xpath('./div[contains(@class, "discoverableCard-type")]').text
except Exception:
    project_type = 'Error'
try:
    title = body.find_element_by_xpath('./div[contains(@class, "discoverableCard-title")]').text
except Exception:
    title = 'Error'
try:
    description = body.find_element_by_xpath('./div[contains(@class, "discoverableCard-description")]').text
except Exception:
    description = 'Error'
try:
    category = body.find_element_by_xpath('./div[contains(@class, "discoverableCard-category")]').text
except Exception:
    category = 'Error'
...

Как было предложено в этой теме или этой теме Я думаю, я мог бы создать списки имен переменных и запросов, а затем использовать цикл for для создания словаря для каждый элемент контейнера, но разве нет других альтернатив, которые, возможно, более читабельны?

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Вы можете абстрагировать вызов на find_element_by_xpath; это позволяет избежать дублирования кода и делает ваш код более читабельным:

def _find_element_by_xpath(body, xpath)
    try:
        return body.find_element_by_xpath(xpath).text
    except Exception:   # <-- Be specific about the Exception to catch
        return 'Error'

def get_a_specific_xpath(element):
    return f'./div[contains(@class, "discoverableCard-{element}")]'

Тогда ваш код становится:

project_type = _find_element_by_xpath(body, get_a_specific_xpath('project_type'))
title = _find_element_by_xpath(body, get_a_specific_xpath('title'))
description = _find_element_by_xpath(body, get_a_specific_xpath('description'))
category = _find_element_by_xpath(body, get_a_specific_xpath('category'))
...
0 голосов
/ 28 июня 2018

Причина, по которой в вашем коде много помех, заключается в том, что у вас есть дублирующий код . Вы выражаете одну и ту же идею (ищите значение, устанавливайте значение по умолчанию, если оно терпит неудачу) четыре раза подряд, что, естественно, означает, что вам также придется писать один и тот же вспомогательный код четыре раза.

Циклы - отличный способ исправить дублирующийся код, поэтому использование списка имен для поиска и создание словаря значений является идеальным решением для вас здесь. Это позволяет вам написать логику один раз , а затем использовать ее много раз.

(Также: ваше дублирование кода привело к ошибке! Первые два блока try-кроме присваивают description значение 'Error' вместо соответствующей переменной. Повторяющийся код может кусаться!)

...