You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 06:55:15