我在python中遇到了一个意外的导入行为,我不明白。希望你能帮我澄清这种行为。假设项目结构如下:
.
└── pkgimp
├── __init__.py
└── testing
├── __init__.py
├── mod_a.py
└── mod_b.py
源代码如下:
pkgimg/\uuu init\uuuuu.py:
import pkgimg.testing
打包/测试/\uu init\uuuuuu.py:
from mod_a import a
from mod_b import b # <- no import of c
包装/测试/mod\u a.py:
a = 123
包装/测试/mod\u b.py:
b = "foo"
c = "bar" # <- not imported
当我用import pkgimp
导入包并用dir(pkgimp.testing)
打印加载的模块时,我看到了我没有导入的mod_a
和mod_b
模块
我得到的是:
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'a', 'b', 'mod_a', 'mod_b']
我假设只有a
和b
将被导入,而既不是mod_a
也不是mod_b
此外,我还可以访问从未导入过的c
>>> pkgimp.testing.mod_b.c
'bar'
我知道,模块中的所有内容都将在导入时进行评估。但是,我想,使用from M import x
只会给我x
而不是整个模块的引用
例如,当我运行以下代码时:
>>> from pkgimp.testing.mod_b import b
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'b']
Python只导入b而不是模块mod_b
。这是我所期望的
导入包中的模块后,总是作为包的属性添加
因此,当从任何其他模块导入
pkgimp.testing.mod_b
时,mod_b
名称被添加到pkgimp.testing
。这是正常的行为在上一个示例中,您将模块中的特定名称导入到本地命名空间中。如果您要通过
sys.modules['pkgimp.testing.mod_b']
检查mod_b
模块,您会发现c
仍然定义在该对象上;整个模块被加载到内存中,对b
的引用被添加到本地名称空间中在这种情况下,
sys.modules['pkgimp.testing']
也将有一个mod_b
属性,它是对pkgimp.testing.mod_b
模块对象的引用相关问题 更多 >
编程相关推荐