我在python中出现了意外的导入行为,我不理解。希望您能帮助我澄清这种现象。假设以下项目结构:
.
└── pkgimp
├── __init__.py
└── testing
├── __init__.py
├── mod_a.py
└── mod_b.py
具有以下源代码:
pkgimg / __ init__.py:
import pkgimg.testing
pkgimg / testing / __ init__.py:
from mod_a import a
from mod_b import b # <- no import of c
pkgimg / testing / mod_a.py:
a = 123
pkgimg / testing / mod_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而不导入module mod_b
。这是我所期望的。
包中的模块一旦导入,就始终作为包的属性添加。
因此,pkgimp.testing.mod_b
从任何其他模块导入时,都会mod_b
在其中添加一个名称pkgimp.testing
。这是正常的行为。
在上一个示例中,您从模块中将特定名称导入了本地名称空间。如果您要检查mod_b
模块,sys.modules['pkgimp.testing.mod_b']
您会发现该模块c
仍在该对象上定义;整个模块将被加载到内存中,并且对它的引用将b
添加到您的本地名称空间中。
在那种情况下,sys.modules['pkgimp.testing']
也会有一个mod_b
属性,该属性是对pkgimp.testing.mod_b
模块对象的引用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句