繁体   English   中英

如何用更少的代码替换多个try / except块?

[英]How can I replace multiple try/except blocks with less code?

我发现自己在下面编写代码很多。 非常冗长。 我想做的是将数组索引分配给不同的变量,如果存在索引错误,则分配false。 我觉得这样做应该有一个较短的语法(与下面的内容相比)。

编辑-这是我的实际代码。 page是有效的lxml.html对象。 每个选择器可能返回也可能不返回值,具体取决于页面上是否存在该部分。

def extract_data( page ):
    # given lxml.html obj, extract data from g+ page and return as dict
    try:
        profile_name = page.xpath( '//div[@guidedhelpid="profile_name"]/text()' )[0]
    except IndexError:
        profile_name = False
    try:
        website = page.cssselect( 'span.K9a' )[0].text_content().rstrip('/')
    except IndexError:
        website = False

    try:
        contact_div = html.tostring( page.xpath( '//div[normalize-space(text())="Contact Information"]/../../..' )[0] )
    except IndexError:
        contact_div = False

    return {
        'profile_name'      :   profile_name,
        'website'           :   website,
        'contact_div'       :   contact_div,
    }

假设您要执行的操作在用例的上下文中有意义,则可以将默认值的这种概念封装在函数内:

def retrieve(my_list, index, default_value=False):
    try:
        return my_list[index]
    except IndexError:
        return default_value

这样,您可以执行以下操作:

my_list = [2, 4]
first = retrieve(my_list, 0)
# first will be 2
second = retrieve(my_list, 1)
# second will be 4
third = retrieve(my_list, 2)
# third will be False

您甚至可以更改默认值,以防索引不存在。

通常,当您像上面那样重复执行代码时,首先要考虑的是是否可以编写一个函数来执行您要执行的操作。


使用您的实际代码,您可以执行以下操作:

profile_name = retrieve(page.xpath( '//div[@guidedhelpid="profile_name"]/text()'), 0)
website = retrieve(page.cssselect( 'span.K9a' ), 0)
if website:
    website = website.text_content().rstrip('/')
contact_div = retrieve(page.xpath( '//div[normalize-space(text())="Contact Information"]/../../..' ), 0)
if contact_div:
    contact_div = html.tostring(contact_div)
vars = ['first', 'second', 'third']
r = {}
for i, var in enumerate(vars):
    try:
        r[var] = l[i]
    except IndexError:
        r[var] = False

这应该可以解决您的问题:) exec +循环进行救援!

l = list([0,2])

numberWords = { 0:"first", 1:"second", 2:"third"}

for i in range(0,len(l)):
    try:
        exec(numberWords[i]+"=l["+str(i)+"]")
    except IndexError:
        exec(numberWords[i]+"=false")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM