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

Postman调用时出现Maximum recursion depth exceeded问题求助

解决Maximum recursion depth exceeded问题方案

我编写了如下inactive_customer_cohorts函数代码,直接运行可得到正常输出,但通过Postman调用时返回500错误,提示"maximum recursion depth exceeded"。

函数代码

def inactive_customer_cohorts(startDate, endDate):
    try:
        print("startDate : ", startDate)
        print("endDate : ", endDate)

        df = data_util.get_customer_scans_df(startDate, endDate)
        columns = ['userId', 'createdAt']

        df = df[columns]
        df['scanQuater'] = ('Q' + df['createdAt'].dt.quarter.astype(str) + '/' + df['createdAt'].dt.year.astype(str))

        quartersMap = dict(zip(df['scanQuater'].unique(), range(len(df['scanQuater'].unique()))))

        scanQuarterUsers = df.groupby('scanQuater')['userId'].apply(list).reset_index()
        scanQuarterUsers['length'] = scanQuarterUsers['userId'].apply(len)


        quarterUsers = {row['scanQuater']: row['userId'] for _, row in scanQuarterUsers.iterrows()}
        quarters = list(quartersMap.keys())

        cumulativePreviousUserIds = set()
        previousQuarterUserMap = {}
        
        data = []
        for i in range(len(quarters)):
            currentQuarter = quarters[i]
            if currentQuarter in quarterUsers:
                nonUniquecurrentUserIds = quarterUsers[currentQuarter]
                currentUserIds = set(quarterUsers[currentQuarter])
                currentCount = len(currentUserIds)
                nonUniqueCurrentCount = len(nonUniquecurrentUserIds)
             
                if cumulativePreviousUserIds:
                    uniqueCommonUserIds = set()
                    quarterCommonCounts = {}
                    for prevQuarter, prevUserIds in previousQuarterUserMap.items():
                        specificCommonUserIds = currentUserIds.intersection(prevUserIds)
                        for userId in specificCommonUserIds:
                            if userId not in uniqueCommonUserIds:
                                uniqueCommonUserIds.add(userId)
                                if prevQuarter in quarterCommonCounts:
                                    quarterCommonCounts[prevQuarter] += 1
                                else:
                                    quarterCommonCounts[prevQuarter] = 1

                    previousQuartersSummary = ", ".join([f"{count} from {quarter}" for quarter, count in quarterCommonCounts.items()])
                    totalSpecificCommonCount = len(uniqueCommonUserIds)
                    newUsers = currentCount - totalSpecificCommonCount

                    data.append({
                            "quarter": currentQuarter,
                            "scanCount": nonUniqueCurrentCount,
                            "uniqueCounts": currentCount,
                            "common": totalSpecificCommonCount,
                            "new": newUsers,
                            "common_breakdown": previousQuartersSummary
                        })
                else:
                    data.append({
                        "quarter": currentQuarter,
                        "scanCount": nonUniqueCurrentCount,
                        "uniqueCounts": currentCount,
                        "common": 0,
                        "new": currentCount,
                        "common_breakdown": ""
                    })

                cumulativePreviousUserIds.update(currentUserIds)
                previousQuarterUserMap[currentQuarter] = currentUserIds
        df = pd.DataFrame(data)
        print(df)
        return df   
    except Exception as e:
        common_util.error_logs(e, 'inactive_customer_cohorts')
        raise e

错误响应

{
 "status": 500,
 "message": "maximum recursion depth exceeded",
 "data": {}
}

解决方案

1. 排查依赖函数的递归逻辑

  • 检查data_util.get_customer_scans_df内部是否存在递归调用(比如递归查询数据、日期范围处理的递归重试);
  • 确认common_util.error_logs是否有递归日志行为(比如日志函数内部触发了再次调用自身或其他递归逻辑)。

2. 修复DataFrame返回的序列化问题

API框架(如Flask、FastAPI)无法直接序列化Pandas DataFrame对象,可能触发递归解析错误。需将DataFrame转为可序列化格式:

# 替换原return df的代码
return df.to_dict('records')  # 转为字典列表,适合大多数API返回
# 或根据框架要求使用
# return df.to_json(orient='records')

3. 临时调整递归深度(不推荐作为长期方案)

若确认是递归深度不足导致,可临时调高Python的递归限制,但可能引发栈溢出风险:

import sys
# 在函数开头或项目初始化时设置
sys.setrecursionlimit(10000)  # 按需调整数值

4. 校验Postman传递的日期参数

Postman传入的日期格式可能与本地运行时不同,导致get_customer_scans_df内部处理异常触发递归。添加参数格式校验:

from datetime import datetime

def inactive_customer_cohorts(startDate, endDate):
    try:
        # 新增日期格式校验,根据实际预期格式调整
        startDate = datetime.strptime(startDate, '%Y-%m-%d')
        endDate = datetime.strptime(endDate, '%Y-%m-%d')
        # 后续原有代码...
    except ValueError as e:
        raise ValueError(f"Invalid date format: {e}. Expected format YYYY-MM-DD")
    except Exception as e:
        common_util.error_logs(e, 'inactive_customer_cohorts')
        raise e

内容的提问来源于stack exchange,提问作者Kartikeya Kawadkar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 12:54:54