背景
训练过的验证码预测模型仍然有小概率出错,为了避免这种错误导致整个流程中断,写了一个 retry 函数。
代码
def retry(func, args, callback, count=3):
'''
重试
:param func: 函数
:param args: 参数
:param callback: 回调函数
:param count: 尝试次数
:return:
'''
retry_num = 0
while True:
retry_num = retry_num + 1
res = func(*args) # 如果回调返回 False 就重试。
if not callback(res) and retry_num < count:
continue
return res
def test(a, b):
'''
测试函数
:param a:
:param b:
:return:
'''
print(a, b)
return a + b, 'ok'
print('lambda 表达式----')
print('成功')
print(retry(test, (1, 2), callback=lambda args: args[1] == 'ok', count=3))
print()
print('失败,总共重试 3 次')
print('最后一次重试结果:', retry(test, (1, 2), callback=lambda args: args[1] == 'okk', count=3))
print()
print('回调函数----')
def test_retry_handle(args):
res, msg = args
print('test_retry_handle', res, msg)
if msg == 'ok1':
return True
return False
print('最后一次重试结果:', retry(test, (1, 2), callback=test_retry_handle, count=3))
输出结果
lambda 表达式----
成功
1 2
(3, 'ok')
失败,总共重试 3 次
1 2
1 2
1 2
最后一次尝试结果: (3, 'ok')
回调函数----
1 2
test_retry_handle 3 ok
1 2
test_retry_handle 3 ok
1 2
test_retry_handle 3 ok
最后一次尝试结果: (3, 'ok')
Process finished with exit code 0
改进
在前一版存在一个问题,不支持单参数,传递一个字符串进来,使用 * 取出 n 个字符作为参数传递。
def retry(func, args, callback, count=3):
'''
重试
:param func: 函数
:param args: 参数
:param callback: 回调函数
:param count: 尝试次数
:return:
'''
retry_num = 0
while True:
retry_num = retry_num + 1
# func 如果回调返回 False 就重试。
# 如果 args 类型是字符串,那么就是单参数,不能用 * 取。
if type(args) == str:
res = func(args)
else:
res = func(*args)
if not callback(res) and retry_num < count:
continue
return res