模块与包
组织代码可以看成三层:
- 函数:一段可调用的逻辑(见「函数」)
- 模块:一个
.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(),只当库用
要点
- 一个
.py文件 = 一个模块;目录(常含__init__.py)= 包 - 用
import/from … import/as引用别的模块 - 用
if __name__ == "__main__"区分「当脚本跑」与「当库被导入」 - 装依赖见「项目与包管理」;发版本见「发布包到公共市场」