| 27 | |
| 28 | |
| 29 | class Retry(object): |
| 30 | |
| 31 | def __init__(self, *, retry_times=3, |
| 32 | wait_secs=5, errors=(Exception, )): |
| 33 | self.retry_times = retry_times |
| 34 | self.wait_secs = wait_secs |
| 35 | self.errors = errors |
| 36 | |
| 37 | def __call__(self, fn): |
| 38 | |
| 39 | def wrapper(*args, **kwargs): |
| 40 | for _ in range(self.retry_times): |
| 41 | try: |
| 42 | return fn(*args, **kwargs) |
| 43 | except self.errors as e: |
| 44 | print(e) |
| 45 | sleep((random() + 1) * self.wait_secs) |
| 46 | return None |
| 47 | |
| 48 | return wrapper |
| 49 | |
| 50 | |
| 51 | class Spider(object): |
nothing calls this directly
no outgoing calls
no test coverage detected