为什么Python包pkg的dir()返回结果中会出现自身pkg名称?
问题结论与原因说明
现象是否正常
这个现象是完全正常的,不属于Python解释器故障或者包结构错误。
触发原因
该现象是你在pkg/__init__.py中使用的导入语句写法直接导致的:
- 当你执行
import pkg时,Python会先实例化pkg模块对象,再执行pkg/__init__.py的代码完成模块初始化 __init__.py中的代码import pkg.aaa是顶层绝对导入,Python解析这条语句时,会先将已经创建的pkg模块对象绑定到当前__init__.py的全局作用域(也就是pkg模块自身的作用域),再继续导入pkg.aaa子模块- 这个隐式绑定的
pkg全局变量就会出现在dir(pkg)的输出结果中,且因为它始终指向模块自身,所以pkg is pkg.pkg.pkg的验证结果为True
为什么其他包没有该现象
绝大多数Python包导入自身子模块时,会用两种更规范的写法避免该问题:
- 相对导入写法:
from . import aaa - 绝对导入别名写法:
import pkg.aaa as aaa
以上两种写法都不会将pkg名称绑定到当前模块的全局作用域,自然不会出现多余的pkg条目。
修复方案
将pkg/__init__.py中的导入语句替换为from . import aaa即可,修改后重新导入pkg,dir(pkg)结果中将不再包含多余的pkg名称,且pkg.aaa的访问能力不受影响。
内容的提问来源于stack exchange,提问作者rad
相关产品推荐
相关产品推荐

