没有exec()解决方案的多个tryexcept

2024-03-29 14:41:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这么多次尝试

errors_log = set()
try:
    page_element = chrome.find_element_by_link_text("Next Page")
except Exception as e:
    errors_log.add(e)
try:
    page_element = chrome.find_element_by_class_name("pager_next")
except Exception as e:
    errors_log.add(e)

根据其他问题的答案,我重构了代码:

page_elements = ['chrome.find_element_by_link_text("Next Page")',
                 'chrome.find_element_by_class_name("pager_next")',]
for page_element in page_elements:
    try:
        exec(page_element)
    except Exception as e:
       errors_log.add(e) 

我对此感到很难过,可能是因为使用exec()

我怎样才能把它重构得不难看?你知道吗


多亏了Zakharov的有用回答,我将代码重构为

actions = [chrome.find_element_by_class_name,
           chrome.find_element_by_link_text]
next_pages = ["pager_next ", "Next Page"]  
prev_pages = ["pager_prev ", "Prev Page"]

def get_page_element_by_multiple_tries(actions, pages):
    """
    Try different context.
    """
    for action, page in zip(actions, pages):
        try:
            page_element = action(page)
        except Exception as e:
            errors_log.add(e) 
            print(e)
    # print(errors_log)
    return page_element

Tags: logaddbyaspageexceptionelementfind
2条回答

可以将Python函数作为对象存储在列表中(因为它们是对象),并在循环中调用它们:

actions = [chrome.find_element_by_link_text, chrome.find_element_by_class_name]
pages = ["Next Page", "pager_next"]

for action, page in zip(actions, pages):
    try:
        page_element = action(page)
    except Exception as e:
        errors_log.add(e)
errors_log = set()
try:
    page_element = chrome.find_element_by_link_text("Next Page")
except Exception as e:
    errors_log.add(e)
    try:
        page_element = chrome.find_element_by_class_name("pager_next")
    except Exception as e1:
        errors_log.add(e1)

为了安抚评论中的那些人,从我对问题和提供的代码的角度来看,上面的代码修改了try块的处理方式。原始代码将检查两者,我发布的代码将只检查类,如果链接文本找不到。例如,如果他想按文本选择的第一个元素与他想按类选择的元素相同,那么如果存在链接文本,那么就不会浪费时间检查替代项是否存在。你知道吗

如果评论中的人有耐心的话,他们会看到解释的。即使他们只是礼貌地问。出于某种原因,人们认为对别人无礼是上帝赋予他们的权利,所以。。。你知道吗

相关问题 更多 >