Повторная попытка 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'
>>>