Python中检查webhook字典嵌套可选键并生成文件名的Pythonic实现方法
原有代码的问题
你现有的实现存在几个明显的可优化/错误点:
str.join用法错误:join仅接收1个可迭代对象参数,你写的file_name.join('chatStarted', '.')不仅不会修改file_name的值,还会直接抛出参数数量不匹配的错误- 重复给变量
x赋值但从未使用,提取到的chat_id也没有用到最终的文件名拼接逻辑中 - 使用裸
except捕获所有异常,会吞掉内存错误、键盘中断等不该忽略的异常,风险极高 - 大量重复的判断逻辑,后续新增事件类型需要新增重复代码,可维护性差
优化后的Pythonic实现
# 定义所有需要检查的事件类型 TOP_LEVEL_EVENTS = ("chatStarted", "chatEnded") MESSAGE_EVENTS = ("receivedMessage", "sentMessage") exist_events = [] chat_id = None # 处理顶层事件 for event_name in TOP_LEVEL_EVENTS: if event_name in r: exist_events.append(event_name) if not chat_id: chat_id = r[event_name]["chat_id"] # 处理messages下的事件 if "messages" in r: msg_data = r["messages"] for event_name in MESSAGE_EVENTS: if event_name in msg_data: exist_events.append(event_name) if not chat_id: chat_id = msg_data[event_name]["chat_id"] # 拼接生成最终文件名 file_name = f"{chat_id}.{'.'.join(exist_events)}.json"
优化说明
- 遵循DRY(Don't Repeat Yourself)原则,用遍历替代重复的if分支,后续新增事件类型只需修改对应元组即可,无需修改逻辑代码
- 用
in判断键是否存在替代try-except,逻辑更清晰,也避免了裸except的风险 - 用列表收集存在的事件名,最后统一用
str.join拼接,避免了反复操作字符串的低效问题 - 用f-string做最终的文件名拼接,可读性更高
- 兼容你给出的所有场景规则,生成的文件名完全符合需求
内容的提问来源于stack exchange,提问作者thelara
相关产品推荐
相关产品推荐

