Python函数单独运行正常但测试报错:TypeError问题排查求助
问题排查与解决
错误根源
测试传入的content_data被额外包裹了一层双引号,导致json.loads(content_data)解析后得到的不是预期的字典,而是普通字符串。
看测试数据:
content_data = '"{\n \\"page\\": {\n \\"layouts\\": []\n },\n \\"reusableBlocks\\": 0,\n \\"layouts\\": {},\n \\"columns\\": {},\n \\"components\\": {}\n}"'
外层双引号让整个JSON对象变成了一个字符串值,解析后content是字符串类型而非字典。此时'layouts' in content会被当成检查字符串中是否包含子串'layouts',后续调用content['layouts'].values()自然触发TypeError——字符串的索引只能是整数。
解决方案
1. 修复测试数据
去掉content_data外层的双引号,让它成为合法的JSON对象字符串:
content_data = '{\n "page": {\n "layouts": []\n },\n "reusableBlocks": 0,\n "layouts": {},\n "columns": {},\n "components": {}\n}'
2. 增强函数健壮性
在函数中增加类型校验,避免非法输入导致报错:
import json def update_content_if_reusable(content_data): """ Add reusable counter """ content = json.loads(content_data) # 确保content是字典类型 if not isinstance(content, dict): return json.dumps(content, indent=4) # 确保layouts是字典类型,再遍历 if 'layouts' in content and isinstance(content['layouts'], dict): for layout in content['layouts'].values(): # 确保layout是字典且包含isReusable字段 if isinstance(layout, dict) and layout.get('isReusable'): # 确保reusableBlocks存在且为整数 if 'reusableBlocks' in content and isinstance(content['reusableBlocks'], int): content['reusableBlocks'] += 1 return json.dumps(content, indent=4)
内容的提问来源于stack exchange,提问作者Andrei Lupuleasa
相关产品推荐
相关产品推荐

