python - 将多个参数传递给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 发送类引用?
解决方案
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):
...
推荐阅读
- java - 在 MATLAB 中从 java .class 运行 main 并附带 .jar 编解码器文件
- gitlab - 如何从私人 gitlab 存储库创建公开发布?
- plot - Julia 中的 3D 散点图
- java - Groovy 日期格式
- python - 使用没有神经网络的预训练词向量进行文本分类
- sql - BigQuery:118% 的峰值使用资源在查询执行期间超过,在分析 over() 中使用最多
- nativescript - 清单合并错误 - Nativescript 5.1
- orgchart - 是否可以将 onClick 事件添加到 nodeMenuButton?
- pandas - Pycharm 无法导入 Pandas
- r - 按产品编号对 R 中的数据进行分组