J'Blog

5 课 · 入门

语义检索

基于 Chroma 向量库,与 Workspace 知识库分离。用自然语言描述你想查的内容。 非管理员每人每天可检索 5 次(消耗站点 AI 配额)。

模块与导入

原文:模块与 import

一句话

学习如何组织代码、导入模块和使用包,构建可维护的Python程序结构。

什么时候翻这页

  1. Agent开发中需要导入和使用第三方工具库
  2. 需要组织大型Python项目,将功能拆分为多个模块
  3. 需要理解Python的模块搜索路径,解决模块导入错误
  4. 开发多模块的Agent工具包,需要使用包结构组织代码

核心概念

  1. 模块:包含Python定义和语句的.py文件,用于组织代码和实现功能复用
  2. 导入:使用import语句将模块中的功能引入当前命名空间
  3. :使用点号分隔的模块命名空间,用于组织相关模块
  4. 模块搜索路径:Python查找模块的目录列表,包括当前目录、PYTHONPATH和标准库路径
  5. __name__属性:模块的特殊属性,表示模块名称,当模块作为主程序运行时值为"main"

怎么做

  1. 创建模块:将相关函数和类放在.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
    
  2. 导入模块:使用不同方式导入模块

    # 导入整个模块
    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)
    
  3. 创建包:创建包含__init__.py文件的目录结构

    sound/
        __init__.py
        formats/
            __init__.py
            wavread.py
            wavwrite.py
        effects/
            __init__.py
            echo.py
            surround.py
    
  4. 使用相对导入:在包中使用.或..表示当前包和上级包

    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 开发的联系

  1. Agent开发中常需要导入各种工具库和API,理解模块导入机制有助于正确集成第三方工具
  2. 构建复杂Agent系统时,将功能拆分为模块和包可以提高代码可维护性和可扩展性
  3. Agent工具包通常使用包结构组织,理解包的导入机制有助于开发模块化的Agent工具

初学者易错点

  1. 循环导入:模块A导入模块B,模块B又导入模块A
  2. 命名冲突:导入的名称与现有变量名冲突
  3. 相对导入在主模块中使用:相对导入只能在包的子模块中使用
  4. 忘记__init__.py文件:没有此文件,目录不会被识别为包
  5. **过度使用from module import ***:可能导致命名空间污染和代码可读性降低

相关词条

  • tutorial-classes:类与对象,面向对象编程基础
  • tutorial-functions:函数,代码复用的基本单元
  • tutorial-scopes:作用域与命名空间,理解变量可见性
  • tutorial-packages:Python包,高级模块组织方式
  • tutorial-stdlib:标准库,Python内置模块集合
  • tutorial-async:异步编程,Agent中常用的执行模式

官方原文:https://docs.python.org/zh-cn/3/tutorial/modules.html