为何isinstance对同类型Google API异常类判断失效?
Google Python SDK重试策略函数异常结果原因解析
问题背景
根据Google重试策略编写了如下重试判断代码:
from google.api_core import exceptions from google.api_core.retry import Retry _MY_RETRIABLE_TYPES = ( exceptions.TooManyRequests, # 429 exceptions.InternalServerError, # 500 exceptions.BadGateway, # 502 exceptions.ServiceUnavailable, # 503 ) def is_retryable(exc): return isinstance(exc, _MY_RETRIABLE_TYPES) my_retry_policy = Retry(predicate=is_retryable)
但测试时得到以下不符合预期的结果:
exceptions.TooManyRequests==exceptions.TooManyRequests -> True is_retryable(exceptions.TooManyRequests) -> False is_retryable(429) -> False is_retryable(exceptions.TooManyRequests.code) -> False is_retryable(exceptions.TooManyRequests.code.value) -> False
原因分析
所有测试失败的核心是传参类型与isinstance()函数要求不匹配:
is_retryable(exceptions.TooManyRequests)返回False:exceptions.TooManyRequests是异常类本身,而isinstance()的第一个参数必须是类的实例对象,不是类。正确的传参应该是创建实例:is_retryable(exceptions.TooManyRequests())。其余测试(传入429、code枚举等)返回False:
这些参数是数字、枚举类或枚举值,完全不属于_MY_RETRIABLE_TYPES定义的异常类实例范畴,isinstance()自然返回False。
正确测试示例
# 创建异常实例后传入测试 test_exc = exceptions.TooManyRequests("test error") print(is_retryable(test_exc)) # 输出True
你的is_retryable函数逻辑本身是符合Google Retry要求的——它接收抛出的异常实例作为参数,只是测试时传错了参数类型。
内容的提问来源于stack exchange,提问作者dataviews
相关产品推荐
相关产品推荐

