尝试在不向代码中添加buku-try/except语句的情况下实现简单的错误处理。
我的if_error函数试图在excel中模拟iferor(value,value_if_error)公式。
If the value (another formula) is valid,
return its resulting value
else
return value_if_error
如何将方法调用从带有参数的beautuloup对象(汤)传递到通用try/except函数?
- 尝试了lambda,但没有足够的理解,无法使用参数&汤
- 看了看Partial,但不知道这怎么能称之为美丽的汤法
- 看看这个但没看到汤会怎么传
我的代码:
def if_error(fn,fail_value):
try:
value = fn
except:
value = fail_value
return value
def get_trulia_data(soup):
d = dict()
description = if_error(soup.find('div', attrs={'class': 'listing_description_module description'}).text,'')
sale_price = if_error(soup.find('div', attrs={'class': 'price'}).text,'0')
sale_price = re.sub('[^0-9]', '', sale_price)
details = if_error(soup.find('ul', attrs={'class': 'listing_info clearfix'}),'')
bed = if_error(soup.find('input', attrs={'id': 'property_detail_beds_org'})['value'],'')
bath = if_error(soup.find('input', attrs={'id': 'property_detail_baths_org'})['value'],'')
...
return d
错误:
Traceback (most recent call last):
data_dict = get_trulia_data(url)
description = if_error(soup.find('div', attrs={'class': 'listing_description_module description'}).text,'')
AttributeError: 'NoneType' object has no attribute 'text'
soup.find方法在达到if_error函数之前一直处于激发状态。我该怎么解决这个问题?
这个怎么样:
def if_error(fn, fail_value, *args, **kwargs):
try:
return fn(*args, **kwargs)
except:
return fail_value
def test_fail(x):
raise ValueError(x)
def test_pass(x):
return x
if __name__=='__main__':
print if_error(test_fail, 0, 4)
print if_error(test_pass, 0, 5)
您的问题是将汤.find()的结果传递给if_error,而不是函数。您可以尝试将实际函数传递给if_error,但我会这样做:
def findError(soup, arg1, arg2, error):
try:
return soup.find(arg1, arg2)
except:
return error
然后呼叫:
findError(soup, 'div', attrs={}, '')
做这样的事情怎么样?
def if_error(f,f_args,fail_value):
try:
value = f(**f_args).text
except:
value = fail_value
return value
其中f_args
是要传递给函数f
的参数的字典。
您需要为错误屏蔽函数提供几个项:要转换为默认值的异常、默认值、要调用的函数及其参数:
def if_error(exceptions, fail_value, fn, *args, **kwargs):
try:
return fn(*args, **kwargs)
except exceptions:
return fail_value
def test_fn(x):
return int(x)
if __name__=='__main__':
print if_error(ValueError, 0, test_fn, '42')
print if_error(ValueError, -1, test_fn, 'abc')
print if_error(TypeError, -2, test_fn, 'abc')
这给了我们:
42
-1
Traceback (most recent call last):
File "test.py", line 13, in <module>
print if_error(TypeError, -2, test_fn, 'abc')
File "test.py", line 3, in if_error
return fn(*args, **kwargs)
File "test.py", line 8, in test_fn
return int(x)
ValueError: invalid literal for int() with base 10: 'abc'
正如您所看到的,上一个调用引发了异常,因为我们没有用它捕获ValueError
。