跳到主要内容

模块与包

组织代码可以看成三层:

  • 函数:一段可调用的逻辑(见「函数」)
  • 模块:一个 .py 文件,里面可以有多个函数/变量
  • 包:装模块的目录(入门惯例带 __init__.py)

直觉:函数 ⊂ 模块(.py) ⊂ 包(目录)。

mypkg/ # 包
__init__.py
core.py # 模块(内含若干函数)
math_utils.py # 同级另一个模块

本篇讲源码怎么组织与导入。依赖怎么安装、锁文件见进阶「项目与包管理」;发到 PyPI 见应用「发布包到公共市场」。

模块与 import​

同一目录下的 math_utils.py 就是一个模块:

# math_utils.py
def double(x):
return x * 2

常见导入方式:

import math_utils
from math_utils import double
import math_utils as mu
  • import math_utils:用 math_utils.double(...)
  • from math_utils import double:直接用 double(...)
  • as:起别名,缩短前缀

包(package)​

惯例上用带 __init__.py 的目录表示常规包(Python 3.3+ 也可无该文件做成命名空间包,入门先按惯例即可):

mypkg/
__init__.py
core.py
from mypkg.core import something

点号表示「包内的模块」:mypkg 是包,core 是其中的模块。

脚本入口​

def main():
print("run as script")

if __name__ == "__main__":
main()
  • 直接运行该文件时,__name__ == "__main__",会执行 main()
  • 被别的文件 import 时,不会执行 main(),只当库用

要点​

  1. 一个 .py 文件 = 一个模块;目录(常含 __init__.py)= 包
  2. 用 import / from … import / as 引用别的模块
  3. 用 if __name__ == "__main__" 区分「当脚本跑」与「当库被导入」
  4. 装依赖见「项目与包管理」;发版本见「发布包到公共市场」