AWS Lambda中Python递归函数无法递归问题排查
问题分析与解决方案
核心问题在于你的replace_recursive函数设计为接收字典列表作为输入,但在Lambda处理函数中直接传入了单个字典。本地测试正常是因为你大概率在本地调用时传入了包含字典的列表,和Lambda的调用逻辑不一致。
原代码的关键问题
- 当传入单个字典时,
for dict1 in data:会遍历字典的键(而非字典本身),后续所有操作都基于字符串键执行,完全偏离预期 - 递归处理嵌套字典时,将结果包装为列表(
replace_recursive([v], mapping)),会导致嵌套结构从字典变成[字典]的格式 - 用
mapping['key'].index(k)查找索引时,若键不在列表中会抛出ValueError,但原代码仅捕获了KeyError,存在未处理的异常隐患
修正后的代码
递归替换函数
def replace_recursive(data, mapping): # 处理列表类型 if isinstance(data, list): return [replace_recursive(item, mapping) for item in data] # 处理字典类型 elif isinstance(data, dict): new_dict = {} for k, v in data.items(): # 递归处理嵌套值 processed_value = replace_recursive(v, mapping) # 替换键名,未匹配则保留原键 if k in mapping['key']: key_index = mapping['key'].index(k) new_key = mapping['value'][key_index] else: new_key = k new_dict[new_key] = processed_value return new_dict # 非容器类型直接返回 else: return data
Lambda处理函数
import json def lambda_handler(events, _): resp = {'statusCode': 200} try: parsed_events = json.loads(events['body']) if parsed_events: op = replace_recursive(parsed_events, schema) resp['body'] = json.dumps(op) except Exception as e: # 新增异常捕获,方便排查问题 resp['statusCode'] = 500 resp['body'] = json.dumps({'error': str(e)}) return resp
修正说明
- 新增类型判断,自动适配列表、字典和基础数据类型,逻辑更健壮
- 采用创建新字典的方式,避免修改原字典带来的副作用
- 提前检查键是否存在于映射列表中,避免不必要的异常
- Lambda处理函数新增全局异常捕获,方便通过CloudWatch排查潜在问题
内容的提问来源于stack exchange,提问作者karthikeyan
相关产品推荐
相关产品推荐

