gpt4 book ai didi

python - 尝试/排除类中的每个方法?

转载 作者:行者123 更新时间:2023-11-28 19:49:07 26 4
gpt4 key购买 nike

我目前正在使用 Google 的 BigQuery API,调用它时,偶尔会给我:

apiclient.errors.HttpError: <HttpError 500 when requesting https://www.googleapis.com/bigquery/v2/projects/some_job?alt=json returned "Unexpected. Please try again.">

返回有点傻,但无论如何,当我为任何调用的方法得到这个时,我只想睡一两秒钟,然后再试一次。基本上,我想用类似的东西包装每个方法:

def new_method
try:
method()
except apiclient.errors.HttpError, e:
if e.resp.status == 500:
sleep(2)
new_method()
else:
raise e

这样做的好方法是什么?

我不想显式地重新定义类中的每个方法。我只想对类中的每个方法自动应用一些东西,这样我就可以为将来做好准备。理想情况下,我会采用一个类对象 o,并围绕它创建一个包装器,用这个 try 重新定义类中的每个方法,但包装器除外,这样我就得到了一些新对象 p,它会在出现 500 错误时自动重试。

最佳答案

装饰器非常适合这个。您可以使用像这样的装饰器来装饰每个相关方法:

(注意使用递归进行重试可能不是一个好主意......)

def Http500Resistant(func):
num_retries = 5
@functools.wraps(func)
def wrapper(*a, **kw):
sleep_interval = 2
for i in range(num_retries):
try:
return func(*a, **kw)
except apiclient.errors.HttpError, e:
if e.resp.status == 500 and i < num_retries-1:
sleep(sleep_interval)
sleep_interval = min(2*sleep_interval, 60)
else:
raise e
return wrapper

class A(object):

@Http500Resistant
def f1(self): ...

@Http500Resistant
def f2(self): ...

要自动将装饰器应用于所有方法,您可以使用又一个装饰器,这次是装饰类:

import inspect
def decorate_all_methods(decorator):
def apply_decorator(cls):
for k, f in cls.__dict__.items():
if inspect.isfunction(f):
setattr(cls, k, decorator(f))
return cls
return apply_decorator

然后像这样申请:

@decorate_all_methods(Http500Resistant)
class A(object):
...

或者喜欢:

class A(object): ...
A = decorate_all_methods(Http500Resistant)(A)

关于python - 尝试/排除类中的每个方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24024966/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com