[英]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.