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

Postman调用get_ticket_type函数报错:id未定义/缺少str参数

问题解决指南

1. 修复local variable 'id' referenced before assignment错误

当前代码的逻辑漏洞在于:仅当umum、anggota、pelajar其中一个等于1时才会给id赋值,如果这三个参数全不为1,id就从未被定义,直接执行db.collection("ticket").document(id)就会触发该错误。

修复方案

在函数开头初始化id,同时添加参数校验逻辑,确保三个参数中至少有一个为1,再补充else分支处理非法参数情况:

def get_ticket_type(db: firestore.Client, logger: logging.RootLogger, umum:int, anggota:int, pelajar:int, tiket_teater:int, jumlah_tiket:int):
    result: dict = {
        "is_get_data": False,
        "is_function_error": False,
    }
    try:
        id = None  # 初始化id
        # 先做参数合法性校验:确保三个票种参数恰好一个为1
        if sum([umum, anggota, pelajar]) != 1:
            result["is_function_error"] = True
            result["error_message"] = "参数错误:umum、anggota、pelajar必须且只能有一个为1"
            return result
        
        if umum == 1:
            id = 4 if tiket_teater == 1 else 1
        elif anggota == 1:
            tiket_teater = 1
            id = 6 if jumlah_tiket >=3 else 5
        elif pelajar == 1:
            tiket_teater = 1
            id = 8 if jumlah_tiket >=40 else 7
        
        # 后续原有逻辑...

2. 修复missing 1 required positional argument: 'str'错误

这个错误并非来自你的函数参数,而是Firestore的document()方法要求传入字符串类型的文档ID,你之前初始化id为None,或者直接传入整数类型的id,都会触发这个方法的参数错误。

修复方案

确保id被正确赋值后,将其转为字符串再传入document()方法:

# 将整数id转为字符串,符合Firestore文档ID要求
doc = db.collection("ticket").document(str(id)).get()

最终完整修复示例

def get_ticket_type(db: firestore.Client, logger: logging.RootLogger, umum:int, anggota:int, pelajar:int, tiket_teater:int, jumlah_tiket:int):
    result: dict = {
        "is_get_data": False,
        "is_function_error": False,
    }
    try:
        id = None
        # 参数合法性校验
        if sum([umum, anggota, pelajar]) != 1:
            result["is_function_error"] = True
            result["error_message"] = "参数错误:umum、anggota、pelajar必须且只能有一个为1"
            return result
        
        if umum == 1:
            id = 4 if tiket_teater == 1 else 1
        elif anggota == 1:
            tiket_teater = 1
            id = 6 if jumlah_tiket >=3 else 5
        elif pelajar == 1:
            tiket_teater = 1
            id = 8 if jumlah_tiket >=40 else 7
        
        # 调用Firestore时传入字符串类型ID
        doc = db.collection("ticket").document(str(id)).get()
        if doc.exists:
            doc_data = doc.to_dict()
            result["is_get_data"] = True
            data: dict = {
                "id": doc_data["id"],
                "Nama Tiket": doc_data["nama_tiket"],
                "Nama Akses": doc_data["nama_akses"],
                "Harga Tiket": doc_data["harga_tiket"]
            }
            result["data"] = data
    except Exception as e:
        logger.error(f"Error occurred: {e}")
        result["is_function_error"] = True
        result["error_message"] = str(e)

    return result

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 17:13:11