一、Python retry模块简介
在Python中进行错误处理时,大多数开发者首先想到的是try-except语句。但如果只是希望某个函数在报错后自动重试若干次,每次都编写大量try-except代码就显得过于繁琐。retry模块正是为了解决这一问题而设计的——通过一个装饰器即可实现,简洁高效。本文接下来将介绍其基本使用方法。

二、retry模块基本用法
retry最常用的方式是将它作为装饰器直接应用于函数上。不传递任何参数时,其效果是:只要函数抛出异常,就会不断重试,直到成功为止。来看一个示例:
from retry import retry
@retry()
def make_trouble():
'''Retry until succeed'''
print ('retrying...')
raise
if __name__ == '__main__':
make_trouble()
# 输出: 一直重试,直到运行成功
retrying...
retrying...
retrying...
retrying...
retrying...
retrying...
在这段代码中,make_trouble()每次执行都会抛出异常,而@retry()装饰器会捕获该异常并重新调用函数,因此控制台会持续打印“retrying...”,直到手动终止或函数最终不再报错。这就是retry的核心机制:自动重试,直至成功。
三、retry参数详解
当然,实际项目中很少会允许无限次重试。retry提供了多个关键参数用于控制重试行为,首先来看它的函数签名:
def retry(exceptions=Exception, tries=-1, delay=0, max_delay=None, backoff=1, jitter=0, logger=logging_logger):
"""Return a retry decorator.
:param exceptions: an exception or a tuple of exceptions to catch. default: Exception.
:param tries: the maximum number of attempts. default: -1 (infinite).
:param delay: initial delay between attempts. default: 0.
:param max_delay: the maximum value of delay. default: None (no limit).
:param backoff: multiplier applied to delay between attempts. default: 1 (no backoff).
:param jitter: extra seconds added to delay between attempts. default: 0.
fixed if a number, random if a range tuple (min, max)
:param logger: logger.warning(fmt, error, delay) will be called on failed attempts.
default: retry.logging_logger. if None, logging is disabled.
"""
下面逐一说明各关键参数的作用:
- exceptions:指定需要捕获的异常类型。默认值为Exception,即捕获所有异常。也可以传入一个元组,例如
(ValueError, TimeoutError),仅对指定类型的异常触发重试机制。 - tries:最大重试次数,默认-1表示无限重试。实际开发中通常设置为有限值,如3或5次。
- delay:每次重试之间的间隔时间(秒),默认0表示不等待。如果设置为2,则每次重试前会等待2秒。
- backoff:间隔时间的指数增长因子。需配合
delay使用,具体计算公式为delay * backoff ** (尝试次数 - 1)。例如delay=3, backoff=2,第一次重试前等待3×2⁰=3秒,第二次等待3×2¹=6秒,第三次等待12秒……以此类推。默认backoff=1表示无增长。 - max_delay:配合backoff使用,设置最大等待时间上限。当
delay * backoffⁿ超过该值后,等待时间不再增长,固定为max_delay。
附录:git源码
四、总结与建议
retry模块最大的优势在于轻量级且直观,只需几行代码即可为函数添加重试机制。相比于手动编写try-except循环,它能让代码更整洁、可读性更高。在实际项目中,合理搭配tries和delay参数,可以优雅地处理网络请求、文件读写等容易出错的场景。当然,若遇到更复杂的重试逻辑(如指数退避、随机抖动),可以考虑功能更强大的tenacity库,但大多数情况下retry模块已经足够满足需求。
