关于Python中from A import B语句执行逻辑的疑问确认
关于
from A import B的执行逻辑纠正 你的理解不正确,正确的执行流程如下:
- 首先定位并初始化模块A(若尚未加载)
- 检查模块A是否存在
B属性:- 若存在,直接将该属性的引用导入当前命名空间
- 若不存在,尝试导入模块A的子模块B(即
A.B) - 子模块B导入完成后,Python会自动将这个子模块作为模块A的属性(也就是
A.B) - 此时再次检查模块A的
B属性(也就是刚导入的子模块B),随后将该子模块本身的引用导入当前命名空间
- 若以上步骤均未找到符合要求的
B,则抛出ImportError
举个实际的目录结构例子:
A/ __init__.py B.py
执行from A import B时:
- 先加载
A模块(对应__init__.py文件) - 检查
A的属性中是否有B,假设__init__.py里未定义B - 尝试导入子模块
A.B(对应B.py文件) - 导入完成后,
A.B成为A的属性 - 最终将
A.B这个子模块本身导入当前命名空间,而非在B.py中查找名为B的属性
内容的提问来源于stack exchange,提问作者IcyBrk
相关产品推荐
相关产品推荐

