使用TMDBv3API获取电影ID时遭遇getattr() TypeError问题求解
解决TMDB API响应中访问'id'属性触发的TypeError问题
1. 修改代码处理TypeError并正确获取'id'
错误原因分析
你遇到的TypeError: getattr(): attribute name must be string,大概率是两种场景导致:
- 调用
getattr()时,第二个参数(属性名)不是字符串类型(比如传了非字符串变量) - TMDB v3 wrapper返回的响应是字典对象而非类实例,用
getattr()访问字典键本身就不符合用法(字典应使用键索引或get()方法)
修正方案
场景1:响应为字典(TMDB wrapper常见返回格式)
直接用字典的get()方法安全获取id,同时避免KeyError:
# 假设response是API返回的字典结构 movie_id = response.get('id') # 可选:设置默认值,防止id字段不存在时返回None movie_id = response.get('id', None)
如果一定要兼容类实例场景,可先判断类型再选择访问方式:
if isinstance(response, dict): movie_id = response.get('id') else: # 确保getattr的第二个参数是字符串常量 movie_id = getattr(response, 'id', None)
场景2:捕获异常做兜底处理
用try-except块直接捕获错误,同时兼容不同响应结构:
try: # 优先尝试字典访问方式 movie_id = response['id'] except (KeyError, TypeError): try: # 兼容类实例属性访问 movie_id = getattr(response, 'id', None) except TypeError: # 兜底处理,比如记录日志或赋值默认值 movie_id = None print("无法获取电影ID:响应结构异常")
2. 对响应对象添加的额外检查
为彻底避免同类错误,处理响应前必须做以下验证:
- 检查响应类型:用
isinstance(response, (dict, object))判断是字典还是类实例,避免用错访问方式 - 验证响应完整性:检查响应是否为空(
if not response:),或判断核心字段是否存在(字典用'id' in response,类实例用hasattr(response, 'id')) - 校验请求状态:通过wrapper返回的
status_code确认请求成功(比如TMDB成功响应的状态码为200),避免处理错误响应 - 类型校验:获取
id后验证其类型为整数(电影ID为整数类型),防止后续逻辑出错:if movie_id is not None and isinstance(movie_id, int): # 执行正常业务逻辑 else: print("电影ID格式无效") - 捕获请求阶段异常:提前捕获网络错误、认证失败等异常,避免无效响应进入后续处理流程
内容的提问来源于stack exchange,提问作者Dark Angel
相关产品推荐
相关产品推荐

