Files
2026-08-03 17:42:04 +08:00

136 lines
6.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 第 1-14 课课堂练习:命令行 Agent 管理系统
#
# 这是 Python 基础阶段综合项目,请按照题目顺序逐步完成。
# 完成要求:
# 1. 每完成一个函数就单独调用并测试,不要等全部写完再运行。
# 2. 需要查找结果时使用 return不要依赖全局变量传递结果。
# 3. 函数名和变量名使用有意义的英文蛇形命名。
# 4. 函数体使用四个空格缩进,并添加必要的中文注释。
# 5. 不要删除题目、测试数据、预期结果和自查注释。
# 6. 完成所有功能后,再执行末尾列出的九组验收测试。
# 第一部分:准备初始数据
# 创建列表 agents其中包含以下两个字典
# 1. name="代码助手"、model="gpt-5"、enabled=True、tools=["搜索", "终端"]
# 2. name="聊天助手"、model="o3"、enabled=False、tools=["搜索"]。
# 完成后临时使用 print(agents) 检查结构,确认每个 Agent 都是一个字典。
# 第二部分:定义 print_menu() 函数
# 1. 函数不接收参数,也不需要 return。
# 2. 使用 print() 输出以下菜单:
# 1. 查看全部 Agent
# 2. 新增 Agent
# 3. 修改 Agent 状态
# 4. 删除 Agent
# 5. 查看 Agent 工具
# 0. 退出程序
# 3. 单独调用一次 print_menu(),确认六个选项均正确显示。
# 第三部分:定义 get_status_text(enabled) 函数
# 1. 参数 enabled 接收布尔值。
# 2. enabled 为 True 时 return "启用",否则 return "停用"。
# 3. 分别传入 True 和 False保存并输出返回值。
# 4. 两次预期输出分别为“启用”和“停用”。
# 第四部分:定义 print_agents(agents) 函数
# 1. 参数 agents 接收 Agent 列表,本函数只负责输出,不需要 return。
# 2. 如果列表为空,输出“当前没有 Agent。”并提前结束函数。
# 3. 如果列表非空,使用 enumerate(agents, start=1) 遍历。
# 4. 调用 get_status_text() 得到中文状态。
# 5. 每条记录按照以下格式输出:
# 1. 代码助手模型gpt-5状态启用
# 6. 分别传入初始 agents 和空列表 [] 测试两个分支。
# 第五部分:定义 find_agent_by_name(agents, name) 函数
# 1. 遍历 agents比较 agent["name"] 和参数 name。
# 2. 找到同名 Agent 时,立即 return 对应的 Agent 字典。
# 3. 循环结束仍未找到时return None。
# 4. 查找“代码助手”,预期返回对应字典。
# 5. 查找“不存在的助手”,预期返回 None。
# 注意:本函数只负责查找,不在函数内部输出“找到”或“未找到”。
# 第六部分:定义 parse_tools(tools_text) 函数
# 1. 参数接收英文逗号分隔的工具文本。
# 2. 使用 tools_text.split(",") 拆分字符串。
# 3. 遍历拆分结果,对每个工具调用 strip()。
# 4. 只把非空且尚未存在的工具加入结果列表。
# 5. 使用 "搜索, 终端,搜索, ,计算器" 测试。
# 6. 预期返回 ["搜索", "终端", "计算器"]。
# 第七部分:定义 add_agent(agents) 函数
# 1. 输入 Agent 名称并清理两侧空白。
# 2. 名称为空时输出“Agent 名称不能为空。”并提前 return。
# 3. 调用 find_agent_by_name() 检查名称;重复时输出“该 Agent 已存在。”并 return。
# 4. 输入模型名称。
# 5. 输入英文逗号分隔的工具文本,并调用 parse_tools() 得到工具列表。
# 6. 创建包含 name、model、enabled 和 tools 的字典,新 Agent 默认 enabled=True。
# 7. 使用 agents.append() 添加字典并输出“Agent 新增成功。”。
# 8. 新增“搜索助手”后调用 print_agents(),预期列表共有三条记录。
# 第八部分:定义 change_agent_status(agents) 函数
# 1. 输入 Agent 名称并调用 find_agent_by_name()。
# 2. 未找到时输出“未找到该 Agent。”并提前 return。
# 3. 找到时执行 agent["enabled"] = not agent["enabled"]。
# 4. 调用 get_status_text() 得到修改后的中文状态并输出。
# 5. 修改“聊天助手”后,它的状态应由 False 变为 True。
# 第九部分:定义 delete_agent(agents) 函数
# 1. 输入 Agent 名称并调用 find_agent_by_name()。
# 2. 未找到时输出“未找到该 Agent。”并提前 return。
# 3. 找到时使用 agents.remove(agent) 删除整个字典。
# 4. 输出“Agent 已删除。”。
# 5. 删除“聊天助手”后调用 print_agents(),确认它不再出现。
# 第十部分:定义 print_agent_tools(agents) 函数
# 1. 输入 Agent 名称并调用 find_agent_by_name()。
# 2. 未找到时输出“未找到该 Agent。”并提前 return。
# 3. 使用 agent.get("tools", []) 安全读取工具列表。
# 4. 工具列表为空时输出“该 Agent 暂无工具。”并提前 return。
# 5. 有工具时使用 enumerate(tools, start=1) 遍历并按编号输出。
# 6. 查看“代码助手”时,预期依次显示“搜索”和“终端”。
# 第十一部分:定义 main() 函数
# 1. 在函数内部使用 while True 持续运行菜单。
# 2. 每轮先调用 print_menu(),再用 input() 接收菜单编号并调用 strip()。
# 3. 使用 if...elif...else 完成以下分发:
# "1" 调用 print_agents(agents)
# "2" 调用 add_agent(agents)
# "3" 调用 change_agent_status(agents)
# "4" 调用 delete_agent(agents)
# "5" 调用 print_agent_tools(agents)
# "0" 输出“程序已退出。”并使用 break 结束循环;
# 其他内容输出“无效选项,请重新输入。”。
# 4. 在文件最后调用 main(),启动完整程序。
# 最终验收测试:
# 1. 输入 1确认显示两个初始 Agent
# 2. 输入 2新增“搜索助手”再次查看时共有三条记录
# 3. 再次新增“搜索助手”,确认重复名称被拒绝;
# 4. 输入 3把“聊天助手”从停用修改为启用
# 5. 输入 5确认“代码助手”显示两个工具
# 6. 输入 4删除“聊天助手”确认列表中不再显示它
# 7. 使用不存在的名称进行查询、修改或删除,确认程序不崩溃;
# 8. 输入 9确认显示无效选项后菜单继续运行
# 9. 输入 0确认程序正常退出。
# 完成后进行代码自查:
# 1. 是否使用列表保存多个 Agent
# 2. 每个 Agent 是否使用字典表示;
# 3. enabled 是否使用真正的布尔值;
# 4. find_agent_by_name() 是否返回字典或 None
# 5. 查找失败后是否提前 return
# 6. 是否使用函数拆分不同功能;
# 7. 菜单循环是否能够正常退出;
# 8. 重复名称是否不会被添加;
# 9. 工具文本是否完成拆分、清理和去重;
# 10. 九组验收测试是否全部通过。