为什么Python会将导入的模块附加到包中?我知道我不应该担心这个,但只是想知道是否有任何解释。在下面的例子中,我的理解是导入logging
会将它添加到模块命名空间。那么为什么还要将它添加到包命名空间呢?
$ tree -I *.pyc
.
├── pkga
│ ├── __init__.py
│ └── modb.py
└── test.py
$ cat pkga/__init__.py
$
$ cat pkga/modb.py
import logging
import types
$ cat test.py
import pkga.modb
import pprint
import sys
pprint.pprint(sorted([ x for x in sys.modules.keys() if x.startswith("pkg")]))
$ python test.py
['pkga', 'pkga.logging', 'pkga.modb', 'pkga.types']
答案 0 :(得分:1)
sys.modules
用作解释器中所有导入模块的缓存,因此它应包含导入的所有模块,无论它们是从哪个位置导入。
编辑:感谢评论,我意识到我没有回答真正的问题,这就是pkga.logging
和pkga.types
在列表中的原因?
正如@vikki所指出的,这可以防止在使用与标准库中的其他模块相同的模块名称时发生问题。例如,如果在logging.py
下创建types.py
或pkga
,sys.modules
的密钥将不会更改。但是pkga.logging
和pkga.types
的值不再是标准模块,而是在该包中实现的模块。