Decorators for functions that you wish to retry
Project description
# trythatagain
[![Build Status](https://travis-ci.org/angstwad/trythatagain.svg?branch=master)](https://travis-ci.org/angstwad/trythatagain)
This provides decorators for super simple function/method call retries when an exception is raised.
## Installation
```bash
pip install trythatagain
```
## Examples
Here's a simple use case: querying the AWS API, knowing you might hit API limits.
```python
from trythatagain import retry
@retry
def find_ebs_volumes(unattached=True, no_snapshots=True):
...
try:
find_ebs_volumes()
except CaughtException as e:
print('Failed to list EBS volumes')
print(e.__cause__)
```
This will retry calling `func` three times. If was not successful in calling the function without an exception, it will re-raise the exception as `CaughtException`, with the original exception available at the attribute `__cause__`.
Retry as many times as times as necessary:
```python
from trythatagain import retry
@retry(retries=5)
def try_five_times():
raise Exception('This always fails')
@retry(retries=0)
def retry_forever():
raise Exception('Terrible waste of CPU cycles')
```
Raise immediately on specific exceptions:
```python
@retry(raise_for=ValueError)
def update_cache():
...
```
Suppress re-raising exceptions:
```python
@retry(reraise=False)
def reload_user_data():
...
```
There's also exponential and linear backoff retries things like cooling down after hitting API limits. In fact, AWS recommends exponential backoff to deal with API limits.
```python
# waits 1 second, then 4, then 9, etc.
@retry_exp_backoff(unit=MILLISECONDS)
def update_instance_tags():
...
@retry_linear_backoff(unit=SECONDS)
def scrape_url():
...
```
Custom wait functions are also possible:
```python
def fixed(i, unit):
time.sleep(5 * unit)
@retry(wait_func=fixed, unit=MILLISECONDS)
def func():
...
```
[![Build Status](https://travis-ci.org/angstwad/trythatagain.svg?branch=master)](https://travis-ci.org/angstwad/trythatagain)
This provides decorators for super simple function/method call retries when an exception is raised.
## Installation
```bash
pip install trythatagain
```
## Examples
Here's a simple use case: querying the AWS API, knowing you might hit API limits.
```python
from trythatagain import retry
@retry
def find_ebs_volumes(unattached=True, no_snapshots=True):
...
try:
find_ebs_volumes()
except CaughtException as e:
print('Failed to list EBS volumes')
print(e.__cause__)
```
This will retry calling `func` three times. If was not successful in calling the function without an exception, it will re-raise the exception as `CaughtException`, with the original exception available at the attribute `__cause__`.
Retry as many times as times as necessary:
```python
from trythatagain import retry
@retry(retries=5)
def try_five_times():
raise Exception('This always fails')
@retry(retries=0)
def retry_forever():
raise Exception('Terrible waste of CPU cycles')
```
Raise immediately on specific exceptions:
```python
@retry(raise_for=ValueError)
def update_cache():
...
```
Suppress re-raising exceptions:
```python
@retry(reraise=False)
def reload_user_data():
...
```
There's also exponential and linear backoff retries things like cooling down after hitting API limits. In fact, AWS recommends exponential backoff to deal with API limits.
```python
# waits 1 second, then 4, then 9, etc.
@retry_exp_backoff(unit=MILLISECONDS)
def update_instance_tags():
...
@retry_linear_backoff(unit=SECONDS)
def scrape_url():
...
```
Custom wait functions are also possible:
```python
def fixed(i, unit):
time.sleep(5 * unit)
@retry(wait_func=fixed, unit=MILLISECONDS)
def func():
...
```
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
trythatagain-0.1.3.tar.gz
(3.4 kB
view details)
Built Distributions
File details
Details for the file trythatagain-0.1.3.tar.gz
.
File metadata
- Download URL: trythatagain-0.1.3.tar.gz
- Upload date:
- Size: 3.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4d28b94140cce0ed20f9ed84126f0488537e292667624bfcfecfd7477785e0e3 |
|
MD5 | 87ded4039a8f751fcd3b8283858e3626 |
|
BLAKE2b-256 | 4b61508cda0195ffd2efecce6372ce219e55003f3535daa5b6862ceb427cb8a9 |
File details
Details for the file trythatagain-0.1.3-py3-none-any.whl
.
File metadata
- Download URL: trythatagain-0.1.3-py3-none-any.whl
- Upload date:
- Size: 4.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7d8970bce2f486f4ae43e56aa263cadd4c00abf209de3696a331799df6fa7c98 |
|
MD5 | f64bda633f626276ed23f41ed88c5ac9 |
|
BLAKE2b-256 | 49af544a920564722793833e685d4b1a3f07cf66d8d2ce859cfccb8441d1fc3c |
File details
Details for the file trythatagain-0.1.3-py2-none-any.whl
.
File metadata
- Download URL: trythatagain-0.1.3-py2-none-any.whl
- Upload date:
- Size: 4.1 kB
- Tags: Python 2
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | c12d5fd3ed1c2787b6d9efaf9e6c2a3a2fcd3efa7e5321dad8d933e7af41ec67 |
|
MD5 | 704e10bfdae1f1019c1eafc738c078e0 |
|
BLAKE2b-256 | 584a54d25e0bbe0370d706fa5fac3134f1e2831c221249df80fba44003538f85 |