invl / retry

easy to use retry decorator in python
Other
709 stars 114 forks source link

Retry decorator not invoked if function it wraps is a generator function #23

Open purplehat7 opened 5 years ago

purplehat7 commented 5 years ago

Consider:

from retry import retry

import logging

logger = logging.getLogger()

@retry((Exception,), tries=2, logger=logger)
def raise_error_generator():
    raise Exception('error')
    ret = []
    for i in range(5):
        ret.append(i)
    return ret

def my_func():
    for i in raise_error_generator():
        print(i)

my_func()

...which gives:

error, retrying in 0 seconds...
Traceback (most recent call last):
  File "test_retry_decorator.py", line 19, in <module>
    my_func()
  File "test_retry_decorator.py", line 16, in my_func
    for i in raise_error_generator():
  File "<decorator-gen-2>", line 2, in raise_error_generator
  File "/Users/alcanno/.virtualenvs/facebook3/lib/python3.7/site-packages/retry/api.py", line 74, in retry_decorator
    logger)
  File "/Users/alcanno/.virtualenvs/facebook3/lib/python3.7/site-packages/retry/api.py", line 33, in __retry_internal
    return f()
  File "test_retry_decorator.py", line 9, in raise_error_generator
    raise Exception('error')
Exception: error

vs:

from retry import retry

import logging

logger = logging.getLogger()

@retry((Exception,), tries=2, logger=logger)
def raise_error_generator():
    raise Exception('error')
    for i in range(5):
        yield i

def my_func():
    for i in raise_error_generator():
        print(i)

my_func()

...which gives (note the lack of the log message from the retry decorator, indicating the function was not retried).

Traceback (most recent call last):
  File "test_retry_decorator.py", line 17, in <module>
    my_func()
  File "test_retry_decorator.py", line 14, in my_func
    for i in raise_error_generator():
  File "test_retry_decorator.py", line 9, in raise_error_generator
    raise Exception('error')
Exception: error
purplehat7 commented 5 years ago

This seems to be related to https://github.com/invl/retry/issues/11