«Повторить» из модуля цепкости не работает с генератором - PullRequest
1 голос
/ 24 марта 2020

У меня проблема с использованием инструмента "Повторить попытку" из библиотеки цепкости в python3. При использовании генератора декоратор «повторная попытка» не работает.

У меня есть пример кода, иллюстрирующий мою ситуацию:

from tenacity import retry, wait_exponential

@retry(wait=wait_exponential(multiplier=1, min=1, max=1))
def test_retry():
print("test retry from tenacity")
for i in range(10):
    if i == 0: raise Exception
    yield i

def gen():
    yield from test_retry()

bar = gen()
for foo in bar:
    print(foo)

Когда он возникает Исключение не повторяется. У кого-нибудь есть идея, почему это не работает?

Спасибо

1 Ответ

1 голос
/ 03 мая 2020

Это ошибка / фича / болото с самим Tenacity, где повторная логика c не работает на функциях генератора. Разработчики Tenacity утверждают, что это связано с тем, что "генераторы используют исключения внутри себя". Далее оригинальный разработчик пишет, что "tenacity.retry () заключает в себе функцию генератора, а не сам генератор (т.е. код пользователя). " В принципе, нет никаких планов изменить это поведение.

Чтобы справиться с этим, в методы, вызывающие генераторы, следует добавить аннотации Tenacity, где Tenacity может легко перехватывать исключения, когда они всплывают в стеке вызовов. Важно: функции генератора также не должны скрывать исключения.

# in generator do this and add retry annotations to calling method
...
try: 
    do_something()
except Exception as ex: 
    log_or_do_something_else()
    raise
finally: 
    cleanup()
yield something
...


# in generator don't do this
...
try: 
    do_something()
except Exception as ex: 
    pass
yield something
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...