首页 > 解决方案 > 将多个参数传递给python中重试的retry_on_exception参数

问题描述

我有一个用例,其中需要重试向表中添加行的方法,以防出现任何异常。我正在使用重试的@retry 装饰器来实现这一点。

其中一种情况是数据库的密码发生更改。我正在使用 arg retry_on_exception 来捕获任何异常。我面临的问题是,我希望在传递给 retry_on_exception 的方法中获取密码。

到目前为止我的代码,

@retry(stop_max_attempt_number=3, retry_on_exception=retry_if_db_error_or_passwd_change)
def add_request_to_db(self, req_id):
    with make_session(self.session_maker) as session:
        session.merge(RequestHolder(request_id=req_id))
        session.commit()

和 retry_if_db_error_or_passwd_change 就像

def retry_if_db_error_or_passwd_change(exception, class_reference):
    is_db_exception = isinstance(exception, DBRetryExceededException)
    is_operational_error = isinstance(exception, OperationalError)

    if is_db_exception:
        return True
    elif is_operational_error or 'Access denied ' in exception:
        fetch_password(class_reference)
        return True

我的问题是,在将可调用对象传递给 retry_on_exception 时,如何使用 retry_if_db_error_or_passwd_change 发送类引用?

标签: pythonretrying

解决方案


retry_if_db_error_or_passwd_change您可以将类引用保留为使用此附加参数调用的包装函数的默认参数:

# assign cls with the desired class reference first

@retry(
    stop_max_attempt_number=3,
    retry_on_exception=lambda exc, cls=cls: retry_if_db_error_or_passwd_change(exc, cls)
)
def add_request_to_db(self, req_id):
    ...

推荐阅读