模块与导入
原文:模块与 import
一句话
学习如何组织代码、导入模块和使用包,构建可维护的Python程序结构。
什么时候翻这页
- Agent开发中需要导入和使用第三方工具库
- 需要组织大型Python项目,将功能拆分为多个模块
- 需要理解Python的模块搜索路径,解决模块导入错误
- 开发多模块的Agent工具包,需要使用包结构组织代码
核心概念
- 模块:包含Python定义和语句的.py文件,用于组织代码和实现功能复用
- 导入:使用import语句将模块中的功能引入当前命名空间
- 包:使用点号分隔的模块命名空间,用于组织相关模块
- 模块搜索路径:Python查找模块的目录列表,包括当前目录、PYTHONPATH和标准库路径
- __name__属性:模块的特殊属性,表示模块名称,当模块作为主程序运行时值为"main"
怎么做
-
创建模块:将相关函数和类放在.py文件中
# fibo.py def fib(n): """Write Fibonacci series up to n.""" a, b = 0, 1 while a < n: print(a, end=' ') a, b = b, a+b print() def fib2(n): """Return Fibonacci series up to n.""" result = [] a, b = 0, 1 while a < n: result.append(a) a, b = b, a+b return result -
导入模块:使用不同方式导入模块
# 导入整个模块 import fibo fibo.fib(1000) # 导入特定函数 from fibo import fib, fib2 fib(500) # 使用别名 import fibo as fib fib.fib(500) # 函数使用别名 from fibo import fib as fibonacci fibonacci(500) -
创建包:创建包含__init__.py文件的目录结构
sound/ __init__.py formats/ __init__.py wavread.py wavwrite.py effects/ __init__.py echo.py surround.py -
使用相对导入:在包中使用.或..表示当前包和上级包
from . import echo from .. import formats from ..filters import equalizer
命令 / API 速查
| 命令/API | 描述 |
|---|---|
import module | 导入整个模块 |
from module import name | 从模块导入特定名称 |
import module as alias | 导入模块并使用别名 |
from module import * | 导入模块中所有非下划线开头的名称 |
dir() | 列出模块或当前命名空间中定义的名称 |
sys.path | 模块搜索路径列表 |
__all__ | 定义from module import *时导入的名称列表 |
与 Agent 开发的联系
- Agent开发中常需要导入各种工具库和API,理解模块导入机制有助于正确集成第三方工具
- 构建复杂Agent系统时,将功能拆分为模块和包可以提高代码可维护性和可扩展性
- Agent工具包通常使用包结构组织,理解包的导入机制有助于开发模块化的Agent工具
初学者易错点
- 循环导入:模块A导入模块B,模块B又导入模块A
- 命名冲突:导入的名称与现有变量名冲突
- 相对导入在主模块中使用:相对导入只能在包的子模块中使用
- 忘记__init__.py文件:没有此文件,目录不会被识别为包
- **过度使用from module import ***:可能导致命名空间污染和代码可读性降低
相关词条
tutorial-classes:类与对象,面向对象编程基础tutorial-functions:函数,代码复用的基本单元tutorial-scopes:作用域与命名空间,理解变量可见性tutorial-packages:Python包,高级模块组织方式tutorial-stdlib:标准库,Python内置模块集合tutorial-async:异步编程,Agent中常用的执行模式