python装饰器实现重试_python重试装饰器(Python function retry decorator)

python重试装饰器(Python function retry decorator)

发布时间:2020-03-11 18:51:47编辑:Run阅读(1348)

python重试装饰器(Python function retry decorator)

在用requests请求接口或者html的时候,很容易出现超时,限制等各种原因。

在对源代码不进行修改的情况下,可以用装饰器来进行重试

任何函数: 成功,返回-结果,失败,返回--False 都可以用这个装饰器进行重试

1.不需要传参的装饰器写法:

max_retry 为默认重试的次数import requests

def retry(func):

def inner(*args, **kwargs):

ret = func(*args, **kwargs)

max_retry = 3

number = 0

if not ret:

while number 

number += 1

print("尝试第:{}次".format(number))

result = func(*args, **kwargs)

if result:

break

return inner

@retry

def get_reponse():

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'

}

url = 'https://www.baidu.com'

try:

r = requests.get(url=url, headers=headers, timeout=0.01)

if r.status_code == 200:

print(r.headers)

return r.headers

except requests.exceptions.ReadTimeout:

return False

except requests.exceptions.ConnectTimeout:

return False

except Exception:

return False

get_reponse()

执行结果:

尝试第:1次

尝试第:2次

尝试第:3次

2.需要传参的装饰器写法:def retry(*args, **kwargs):

def warpp(func):

def inner():

ret = func()

max_retry = kwargs.get('max_retry')

# 不传默认重试3次

if not max_retry:

max_retry = 3

number = 0

if not ret:

while number 

number += 1

print("尝试第:{}次".format(number))

result = func()

if result:

break

return inner

return warpp

@retry(max_retry=5)  # 不传默认为3次  @retry() 括号需要带

def get_reponse():

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'

}

url = 'https://www.baidu.com'

try:

r = requests.get(url=url, headers=headers, timeout=0.01)

if r.status_code == 200:

print(r.headers)

return r.headers

except requests.exceptions.ReadTimeout:

return False

except requests.exceptions.ConnectTimeout:

return False

except Exception:

return False

get_reponse()

执行结果:

尝试第:1次

尝试第:2次

尝试第:3次

尝试第:4次

尝试第:5次

3. 装饰器在类的用法import requests

class Test:

def retry(*args, **kwargs):

def warpp(func):

def inner(self, *args, **kwargs):

ret = func(self, *args, **kwargs)

max_retry = kwargs.get('max_retry')

# 不传默认重试3次

if not max_retry:

max_retry = 3

number = 0

if not ret:

while number 

number += 1

print("尝试第:{}次".format(number))

result = func(self, *args, **kwargs)

if result:

break

return inner

return warpp

@retry()

def get_reponse(self, url):

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'

}

try:

r = requests.get(url=url, headers=headers, timeout=0.01)

if r.status_code == 200:

print(r.headers)

return r.headers

except requests.exceptions.ReadTimeout:

return False

except requests.exceptions.ConnectTimeout:

return False

except Exception:

return False

if __name__ == '__main__':

st = Test()

url = 'https://www.baidu.com'

st.get_reponse(url)

运行结果:

尝试第:1次

尝试第:2次

尝试第:3次

关键字:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值