我在我的脚本中有多个函数,它执行REST API API请求。由于我需要处理错误情况,我已经将重试机制如下所示。
no_of_retries = 3
def check_status():
for i in range(0,no_of_retries):
url = "http://something/something"
try:
result = requests.get(url, auth=HTTPBasicAuth(COMMON_USERNAME, COMMON_PASSWORD)).json()
if 'error' not in result:
return result
else:
continue
except Exception as e:
continue
return None
我有几种不同的方法做类似的操作。如何才能更好的避免重复的方法可能是使用装饰器。
8条答案
按热度按时间iq0todco1#
如果你不介意安装一个库,你可以使用
tenacity
(github.com/jd/tenacity)模块。他们的一个例子:这也允许你指定你想要保持重试的尝试次数或秒数。
对于您的情况,这可能看起来像这样(未测试!):
ibrsph3r2#
您可以使用这样的装饰器并处理自己的异常。
ttygqcqt3#
第三方retry module是用于此目的的选项。您还可以传递要重试的异常列表、重试次数、延迟、最大延迟、指数回退等。
示例用法:
im9ewurl4#
生产级示例
用法
正式参考:https://peps.python.org/pep-0318/
klr1opcd5#
我推荐使用retry库,就像@MohitC提到的那样。但是,如果你像我一样被限制导入第三方库,欢迎你尝试我的版本:
使用示例:
很简单:
高级:
mbjcgjjk6#
与其使用装饰器,可能更好的解决方案是将请求移动到它自己的函数中,得到类似于下面的结构:
这样,在封装请求时可以避免重复代码。如果你要使用装饰器,你需要 Package 整个
load_file()
方法,这将阻止你在这个函数中进一步处理请求的结果。wr98u20j7#
我创建了一个自定义重试函数。如果第一个数字小于第二个数字,则该函数将重试。
验证码:
输出:
vojdkbi08#
在mrkiril的答案上使用
functools
:然后,像下面这样 Package 你的函数: