问题的历史: 包在Python中出现是为了组织大型代码库和重复使用代码。它们允许将项目拆分为逻辑模块,从而简化了所需功能的支持和导入。
问题: 对包结构的不正确理解会导致导入错误、名称冲突和脚本运行错误。重要的是知道包和模块之间的区别,以及相对和绝对导入的工作规则。
解决方案:
包是指任何包含__init__.py文件(空的或包含初始化代码)的目录。包可以包含其他包和模块。结构示例如下:
project/
├── mypackage/
│ ├── __init__.py
│ ├── mod1.py
│ └── subpackage/
│ ├── __init__.py
│ └── mod2.py
└── script.py
导入时使用相对路径(from .subpackage import mod2)或绝对路径(from mypackage.subpackage import mod2)。对于大型项目,绝对导入更为优先。
关键特性:
__init__.py来定义每个我们想做成包的文件夹中是否必须包含__init__.py?
是的,对于Python 3.3之前的版本;在现代的Python版本(3.3+)中有“隐式”命名空间包,但为了完全兼容,仍建议包含该文件。
如果导入包而不是模块,会发生什么?
只会执行该包中的__init__.py文件中的代码。
“from . import mod1”和“import mod1”之间有什么区别?
from . import mod1(相对导入)仅在包内部工作,而绝对导入会在sys.path中查找模块,这可能导致名称冲突。
__init__.py文件消极案例: 在不同子文件夹中使用相同名称的模块而不使用绝对导入。一个模块被错误的包引用。 优点:
积极案例:
明确设定绝对导入、正确的文件夹结构和__init__.py的存在。
优点: