求示例解释Python中__init__.py阻止同名目录隐藏模块的机制
示例解释:init.py如何防止同名目录隐藏系统模块
背景
Python导入模块时,会按sys.path里的路径顺序查找,当前工作目录通常排在系统模块目录的前面。
场景1:没有__init__.py的同名目录
假设你不小心在项目根目录创建了一个名为string的空目录:
my_project/ └── string/ # 空目录,无__init__.py
当你在项目根目录运行Python并执行import string:
- Python先找到当前目录下的
string目录,但因为没有__init__.py,不会将其视为包(除非启用命名空间包特性)。 - 于是Python继续往后搜索,最终导入系统自带的
string模块。 - 此时你能正常使用系统
string的功能:import string print(string.ascii_uppercase) # 输出: ABCDEFGHIJKLMNOPQRSTUVWXYZ
场景2:存在__init__.py的同名目录
如果给这个string目录添加一个空的__init__.py文件:
my_project/ └── string/ └── __init__.py # 空文件
当你执行import string时:
- Python识别到带有
__init__.py的string目录,将其视为常规包并导入。 - 此时导入的是你自定义的
string包,而非系统的string模块。 - 尝试调用系统
string的功能会报错:import string print(string.ascii_uppercase) # 报错: AttributeError: module 'string' has no attribute 'ascii_uppercase'
核心逻辑
init.py的存在是明确告知Python“这个目录是我刻意创建的包”。如果没有这个文件,Python会忽略同名目录,继续搜索后续的有效模块,避免了因误创建同名目录而导致系统模块被意外隐藏的问题。
内容的提问来源于stack exchange,提问作者IcyBrk
相关产品推荐
相关产品推荐

