函数越来越多时,把所有代码放在一个文件里会变得难找、难改。真实 Agent 通常把不同工具拆到不同模块,再由主程序统一调用。
今天学习模块与 import:让多个 Python 文件分工合作。
今天完成 4 件事
1|理解模块与文件关系
2|掌握两种 import 写法
3|使用点号调用工具
4|完成双文件 Agent 项目
一个扩展名为 .py 的 Python 文件,就是一个模块。新建文件夹 day10_agent,在里面创建:
day10_agent/
├─ tool_box.py
└─ main.pytool_box.py 保存工具函数,main.py 负责接收任务和调用工具。两个文件放在同一文件夹,初学阶段最容易导入。
在 tool_box.py 中写入:
def format_task(task):
return f"待处理任务:{task}"
def add(a, b):
return a + b直接运行这个文件不会输出内容,因为这里只有函数定义,没有函数调用。Python 会记录两个函数,但函数体都还没有执行。
在 main.py 中写入:
import tool_box
message = tool_box.format_task("整理 Python 笔记")
total = tool_box.add(12, 8)
print(message)
print(total)import tool_box 会找到同一文件夹里的 tool_box.py,并建立模块名称 tool_box。调用函数时写 tool_box.format_task()。
点号左边是模块对象,右边是模块里的函数属性。format_task 是我们定义的函数名,不能写成不存在的 format_tasks,否则会触发 AttributeError。
四、用 from ... import 导入指定函数from tool_box import add
total = add(5, 7)
print(total)这种写法把 add 直接放进当前文件,因此调用时不写 tool_box.。它更短,但当不同模块有同名函数时,不容易看出函数来自哪里。
零基础阶段推荐先用 import tool_box,让来源保持清楚。
Python 自带许多标准库,不需要另外安装。例如:
import random
tools = ["搜索", "计算器", "文件读取"]
selected = random.choice(tools)
print(f"随机选择的工具:{selected}")random 是模块,choice() 是模块中的函数,tools 是实际参数。列表非空时,它会随机返回一个元素。
不要把自己的文件命名为 random.py,否则 import random 可能先导入你自己的文件,导致真正的标准库功能找不到。
tool_box.py:
def search_tool(keyword):
return f"搜索工具收到关键词:{keyword}"
def calculator_tool(a, b):
return f"计算结果:{a + b}"main.py:
import tool_box
task_type = input("请选择工具:搜索或计算器:")
if task_type == "搜索":
keyword = input("请输入关键词:")
result = tool_box.search_tool(keyword)
elif task_type == "计算器":
a = int(input("请输入第一个整数:"))
b = int(input("请输入第二个整数:"))
result = tool_box.calculator_tool(a, b)
else:
result = "没有找到对应工具"
print(result)在 day10_agent 文件夹中运行:
主程序只选择工具,具体执行代码放在 tool_box.py。这就是最小的多文件 Agent 结构。
1.tool_box.py 与 main.py 不在同一目录,触发 ModuleNotFoundError;
2. 文件名大小写或拼写不一致;
3. 模块存在,但点号后的函数名写错,触发 AttributeError;
4. 自己的文件名覆盖标准库模块,例如 random.py、json.py。
还要分清:import tool_box 是导入语句,tool_box.search_tool() 才是函数调用。
新建 text_tools.py,定义 count_words(text),返回字符串长度;再在 main.py 中导入模块并调用两次。
分别测试空字符串和“Python Agent”,记录函数体执行次数和每次实参是什么。
• 一个 .py 文件就是一个模块;
• import 模块名 会建立模块对象;
• 模块名.函数名() 可以明确工具来源;
• from 模块 import 函数 可以直接导入指定函数;
• 多文件结构让 Agent 的主流程与工具实现分离。
下一篇,我们学习异常处理 try / except:当输入错误或工具失败时,让 Agent 给出提示,而不是直接崩溃。
完成练习后,欢迎留言:第 10 天完成。