52 lines
938 B
Python
52 lines
938 B
Python
"""
|
|
装饰器的应用
|
|
"""
|
|
from functools import wraps
|
|
from random import randint
|
|
from time import sleep
|
|
|
|
|
|
class Retry():
|
|
"""让函数可以重试执行的装饰器"""
|
|
|
|
def __init__(self, times=3, max_wait=0, errors=(Exception, )):
|
|
self.times = times
|
|
self.max_wait = max_wait
|
|
self.errors = errors
|
|
|
|
def __call__(self, func):
|
|
|
|
@wraps(func)
|
|
def wrapper(*args, **kwargs):
|
|
for _ in range(self.times):
|
|
try:
|
|
return func(*args, **kwargs)
|
|
except self.errors:
|
|
sleep(randint(self.max_wait))
|
|
|
|
return wrapper
|
|
|
|
|
|
def retry(*, times=3, max_wait=0, errors=(Exception, )):
|
|
"""让函数重试执行的装饰器函数"""
|
|
|
|
def decorate(func):
|
|
|
|
@wraps(func)
|
|
def wrapper(*args, **kwargs):
|
|
for _ in range(times):
|
|
try:
|
|
return func(*args, **kwargs)
|
|
except errors:
|
|
sleep(randint(max_wait))
|
|
return wrapper
|
|
|
|
return decorate
|
|
|
|
|
|
# @Retry(max_wait=5)
|
|
@retry(max_wait=5)
|
|
def get_data_from_url(url):
|
|
pass
|
|
|