Повторная попытка Python3 с упорством (без декораторов) дает ошибку с заявлением о "недостающих аргументах" при использовании gspread

Я пытаюсь использовать модуль упорства, чтобы избежать частых ошибок запроса (APIErrorс) от распростран. Я понимаю общие примеры использования декораторов упорства, но я хочу использоватьRetrying() функция, чтобы я мог повторить попытку метода обновления ячейки электронной таблицы gspread sheet.update_acell() вместо.

По какой-то причине повторная попытка с sheet.update_acell()на самом деле не "дает" аргументы функции (или чему-то еще). Однако пример с надуманным множеством аргументов работает отлично.

Мой код (кроме импорта и учетных данных Google API):

# gspread authorization
gs_client = gspread.authorize(creds)
workbook = gs_client.open_by_key(sheet_key)
sheet = workbook.sheet1

ret = tenacity.Retrying(stop=tenacity.stop_after_attempt(30),
                        wait=tenacity.wait_exponential(multiplier=0.5, max=60))

# contrived example
def retry_example(arg0, arg1):
    print(arg0, arg1)
ret.call(retry_example,'foo','bar')  #works perfectly

# gspread example
ret.call(sheet.update_acell(),'A1',1)  #doesn't work, the arguments aren't found

Выход:

foo bar
Traceback (most recent call last):
  File "c:/Users/.../tenacitytest.py", line 28, in <module>
    ret.call(sheet.update_acell(),'A1',1)
TypeError: update_acell() missing 2 required positional arguments: 'label' and 'value'

Без упорства запускать все, что нужно, так что я уверен, что звоню update_acell() правильно.

Я чувствую, что это может быть связано с тем, что update_acell() это метод, в отличие от example_func()? Любая помощь будет оценена.

1 ответ

Решение

Вы не должны использовать круглые скобки при повторном вызове. Вы должны передать параметры, как показано ниже

Надеюсь, это сработает;)

ret.call(sheet.update_acell,'A1',1)

Пример:

from tenacity import Retrying, stop_after_attempt

def foo(arg1, arg2):
    print('Arguments are: {} {}'.format(arg1, arg2))
    raise Exception('Throwing Exception')

def bar(max_attempts=3):
    retryer = Retrying(stop=stop_after_attempt(max_attempts), reraise=True)
    retryer(foo, 'my arg1', 'my arg2')

Давайте попробуем сценарий ошибки:

>>> from tenacity import Retrying, stop_after_attempt
>>>
>>> def foo(arg1, arg2):
...     print('Arguments are: {} {}'.format(arg1, arg2))
...     raise Exception('Throwing Exception')
...
>>> def bar(max_attempts=3):
...     retryer = Retrying(stop=stop_after_attempt(max_attempts), reraise=True)
...     retryer(foo(), 'my arg1', 'my arg2')
...
>>> bar()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in bar
TypeError: foo() missing 2 required positional arguments: 'arg1' and 'arg2'
>>>   
Другие вопросы по тегам