Python实现retry功能(pythonic,装饰器模式)
程序员文章站
2022-04-02 11:17:38
# pip install的时候经常能看到retry,于是想自己实现retry功能。更符合Python语言风格的是装饰器版。# 方法一 用脚本运行自身脚本# 触发某个条件重新运行该文件即可。控制器需要通过文件或者数据库来限制。# 不可以在脚本里写触发器,因为会无限递归(即使自己限制了最大递归层数也不可)# 脚本中还可加入重试时间间隔。import osdef retry1(try_times): try: 1/0 except: file =...
# pip install的时候经常能看到retry,于是想自己实现retry功能。更符合Python语言风格的是装饰器版。 # 脚本中还可加入重试时间间隔。 # 方法一 用脚本运行自身脚本 # 触发某个条件重新运行该文件即可。控制器需要通过文件或者数据库来限制。 # 不可以在脚本里写触发器,因为会无限递归(即使自己限制了最大递归层数也不可) import os def retry1(try_times): try: 1/0 except: file = '' config = open(file).read() # 这里通过读取文件的方式获取重试的次数。demo版 times = int('......') # demo版 times += 1 if times < try_times: with open(file, mode='w', encoding='utf-8') as f: f.write(str(times)) # 把更新后的重试次数写入文件 print("报错,再次运行, 第 {}次".format(times - 1)) os.system(f"python {__file__}") # 方法二 装饰器版 from functools import wraps def pythonic_retry(times=3): time_dic = {} def controller(status, func, *args, **kwargs): already_try_time = time_dic.get("already_try_time", 1) if status: print("程序运行完成") elif not status and already_try_time <= times: print(f"第{already_try_time}次运行错误") time_dic["already_try_time"] = already_try_time + 1 status = func(*args, **kwargs) return controller(status, func, *args, **kwargs) else: print("已达到最大重试次数,程序终止") return def outer(func): @wraps(func) def inner(*args, **kwargs): status = func(*args, **kwargs) return controller(status, func, *args, **kwargs) return inner return outer
@pythonic_retry() def zero_division(): try: 1 / 0 # 1 / 1 return True except: # print("出现错误") return # 方法三 装饰器版 与方法二核心思路一致,但是巧妙应用了return,不需要额外再构造一个控制器。 from functools import wraps def pythonic_retry2(times=3): def outer(func): @wraps(func) def inner(*args, **kwargs): for i in range(times): try: status = func(*args, **kwargs) except Exception: print(f"正在重试第{i+1}次") pass else: print(111) return status return inner return outer
@pythonic_retry2() def zero_division2(): 1 / 0 if __name__ == '__main__': zero_division() print("======分隔符======") zero_division2()
本文地址:https://blog.csdn.net/weixin_42661676/article/details/108268714
上一篇: python算数运算符,比较运算符的使用及if语句的使用
下一篇: golang接口解决跨域问题