Python 返回false而不是抛出错误的设计模式
我正在从事一个Python项目,从各种外部源中获取数据。除了一些脚本只是实例化一些对象并调用几个方法之外,所有的东西都是面向对象的。所以所有的逻辑都在不同的类中。 我没有任何具体的代码来说明我的观点 基本上,我有一个函数,它尝试刮取URL,如果成功,则返回数据,否则返回false。 另一个函数Python 返回false而不是抛出错误的设计模式,python,oop,design-patterns,Python,Oop,Design Patterns,我正在从事一个Python项目,从各种外部源中获取数据。除了一些脚本只是实例化一些对象并调用几个方法之外,所有的东西都是面向对象的。所以所有的逻辑都在不同的类中。 我没有任何具体的代码来说明我的观点 基本上,我有一个函数,它尝试刮取URL,如果成功,则返回数据,否则返回false。 另一个函数saveData()使用此函数的返回值将数据保存到文件中。如果刮取不成功并返回false,则saveData()返回false。然后这就被传下去了,让我们说它一直在继续 之所以scrape()返回false
saveData()
使用此函数的返回值将数据保存到文件中。如果刮取不成功并返回false,则saveData()
返回false。然后这就被传下去了,让我们说它一直在继续
之所以scrape()
返回false而不是抛出错误,是因为我将在脚本中使用它来刮取许多URL,我不希望它因为一个错误的URL而死亡
我真的不喜欢这种“滴流”效应,在这种效应中,我必须一路检查错误值,以避免错误
理想的解决方案是,一旦URL无法抓取,就停止处理该URL。我觉得这是一个常见的情况,可能有一些设计模式来避免它
也许这太抽象了。如果我理解你的要求,那就是找到一个干净的方法,在抓取URL失败时尽早退出。在这种情况下,我将使用带有前哨值的
过滤器
和映射
:
# only used if in python 2
from future_builtins import map, filter
# just make sure your sentinal is a value that cannot be possibly considered valid
_sentinal = None
def scrape(url):
try:
return attempt_scrape(url)
except Exception:
return _sentinal
url_data = map(scrape, sequence_of_urls)
good_scrapes = filter(lambda v: v is not _sentinal, url_data) # only return the values we want
saved = map(saveData, good_scrapes)
# force running the chained iterators now
for s in saved:
pass
这肯定不是一个答案,但我最近一直在玩。也许你会发现它很有用。