跳转到内容

搜索

Python 的代码组织方式:module、package 与 library

拾知 7 min read

任何一个以 .py 结尾的 Python 文件 就是一个模块(module),它包含具体的代码(函数、类、变量);一个包含多个模块(.py 文件)的目录/文件夹就是一个包(package),它可以被组织成树形结构;库(libray)是一个模糊的统称,通常指由一个或多个 package/module 组成的集合。

在 Python 中,Module(模块)Package(包) 以及 Library(库) 是组织代码的核心概念,它们就像文件、文件夹和图书馆的关系一样,层层递进。

核心组织层级

1. Module(模块):单个代码文件

  • 本质:任何一个以 .py 结尾的 Python 文件 就是一个模块。
  • 目的:把相关的变量、函数、类组织在同一个文件里,方便复用和管理。
  • 示例:你写了一个 math_utils.py,里面包含各种数学计算函数。这个文件就是一个 Module。
  • 使用方式import math_utils [1]

2. Package(包):包含模块的文件夹

  • 本质:一个包含多个模块(.py 文件)的 目录/文件夹

  • 目的:当模块越来越多时,单文件会变得臃肿。Package 通过“目录树”的结构,把功能相近的模块组织在一起,形成分层命名空间(如 A.B)。

  • 特征:通常包含一个 __init__.py 文件(常规包)[1]。

  • 示例

    game/                  # 这是一整个 Package
    ├── __init__.py
    ├── sound/             # 这是一个子包 (Sub-package)
    │   ├── __init__.py
    │   └── echo.py        # 这是一个 Module
    └── graphics/          # 另一个子包
        ├── __init__.py
        └── screen.py      # 另一个 Module
  • 使用方式import game.sound.echo

3. Library(库):更宏观的概念

  • 本质:一个模糊的统称,通常指由 一个或多个 Package / Module 组成的高级集合
  • 目的:为了解决某一类特定问题而提供的一整套工具。
  • 分类
    • 标准库(Standard Library):Python 自带的库,不需要安装,直接导入(如 os, sys, json)。
    • 第三方库(Third-party Library):别人写好并发布到 PyPI 上的库,需要用 pip install 安装(如 requests, numpy, pandas)。
进一步阅读:代码的微观组织:Variable (变量)、Function (函数)、Class (类)

1. Variable (变量) —— 最小的数据单元

  • 本质:指向内存中某个对象的标签。
  • 组织核心LEGB 作用域法则——Python 寻找一个变量时,会严格按照 L ➔ E ➔ G ➔ B 的顺序从内到外依次查找,找不到就会报 NameError。。
    • L (Local):函数内部。
    • E (Enclosing):闭包(外部嵌套函数)。
    • G (Global):当前模块/文件顶层。
    • B (Built-in):Python 内置(如 len, str)。
  • 组织建议:尽量避免使用 global 关键字。数据应当通过参数显式传递,保持函数“纯净”。

2. Function (函数) —— 最小的逻辑单元

  • 本质:封装了一段可重复执行的代码块。
  • 组织核心单一职责原则 (SRP)
    • 一个函数应当只做一件事(例如:计算税率打印发票 应该拆分为两个函数)。
  • 组织建议:函数名使用动词或动宾短语(如 calculate_total)。如果函数超过 50 行,通常意味着可以继续拆分。

3. Class (类) —— 状态与行为的结合体

  • 本质:将数据(属性/变量)和操作数据的方法(函数)打包在一起的蓝图。
  • 组织核心高内聚,低耦合
    • 类把相关的变量和函数内聚在一起,形成一个独立的实体。
  • 组织建议:类名使用大驼峰(PascalCase)。如果一个类只需要一个方法,通常写成一个普通的 Function 会更轻量、更 Pythonic。

标准项目目录

一个规范、易于发布和协作的 Python 项目,通常具备以下标准目录结构:

my_project/

├── my_package/              # 核心业务逻辑包
│   ├── __init__.py          # 初始化包或暴露公开接口
│   ├── core.py              # 核心功能模块
│   └── utils.py             # 工具函数模块

├── tests/                   # 单元测试目录
│   ├── __init__.py
│   └── test_core.py

├── docs/                    # 项目文档
├── data/                    # 数据文件(如模型权重、静态数据)

├── requirements.txt         # 生产环境依赖包列表
├── setup.py / pyproject.toml# 项目安装与分发配置文件
├── README.md                # 项目说明文件
└── LICENSE                  # 开源协议

关键文件说明

  • __init__.py:在导入包时最先执行。常用于简化模块导入路径(例如:from my_package.core import func 简化为 from my_package import func)或定义包级别的全局变量。
  • __main__.py:作为包的入口。如果包内包含此文件,可以直接通过 python -m my_package 运行整个包。

导入

导入规则

  • 绝对导入 (Absolute Import):始终从项目根目录或第三方库的根路径开始导入,如 from my_package.core import function,这是推荐的标准做法。
  • 相对导入 (Relative Import):使用 . 表示当前目录,.. 表示父级目录,如 from .utils import helper。仅适用于包内部模块之间的相互调用,方便重构。
  • 避免通配符导入 (from module import *):这会污染命名空间,导致变量来源不明。推荐显式导入所需对象。

导入语法

  • 语法1: import <X>
    • <X> 必须是:一个 Module(模块/.py文件) 或一个 Package(包/文件夹)
    • 绝对不能是:类(Class)、函数(Function)或变量(Variable)。
    • 代码里的调用方式:必须带前缀:X.name
  • 语法2: from <Y> import <Z>
    • <Y> 必须是:一个 Package(包) 或一个 Module(模块)
    • <Z> 可以是任何东西(子包、模块、类、函数、变量)。
    • 代码里的调用方式:直接使用:Z