1

我正在尝试使用 tenacity 模块来避免APIError来自 gspread 的频繁请求错误(s)。我了解坚韧使用装饰器的常见示例,但我想使用坚韧的Retrying()功能,所以我可以让它重试 gspread 的电子表格单元格更新方法sheet.update_acell()

出于某种原因,使用重试sheet.update_acell()实际上并没有“给”函数(或其他东西)的参数。然而,一个人为的多参数示例完美地工作。

我的代码(进口和谷歌 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'

运行 gspread 的东西没有韧性,所以我确信我的调用是update_acell()正确的。

我觉得这可能与 gspreadupdate_acell()是一种方法这一事实有关,不像example_func()?任何帮助,将不胜感激。

4

1 回答 1

2

您不应在 Retrying 调用中使用括号。您应该传递如下参数

希望这会奏效;)

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'
>>>   
于 2020-06-06T21:15:02.903 回答