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
相关产品推荐
相关产品推荐

