为什么python将导入的模块附加到包中?

时间:2012-02-09 07:11:28

标签: python import module

为什么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']

1 个答案:

答案 0 :(得分:1)

sys.modules用作解释器中所有导入模块的缓存,因此它应包含导入的所有模块,无论它们是从哪个位置导入。

编辑:感谢评论,我意识到我没有回答真正的问题,这就是pkga.loggingpkga.types在列表中的原因?

正如@vikki所指出的,这可以防止在使用与标准库中的其他模块相同的模块名称时发生问题。例如,如果在logging.py下创建types.pypkgasys.modules的密钥将不会更改。但是pkga.loggingpkga.types的值不再是标准模块,而是在该包中实现的模块。