Python 重试函数 retry 与 lambda 回调

背景

训练过的验证码预测模型仍然有小概率出错,为了避免这种错误导致整个流程中断,写了一个 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')

失败,总共重试 31 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值