为什么python将导入的模块附加到包中?
问题描述:
为什么Python将导入的模块附加到包中?我知道我不应该担心这个,但只是想知道是否有任何解释。在以下情况下,我的理解是导入logging
会将其添加到模块名称空间。那么为什么要将它添加到包名称空间呢?为什么python将导入的模块附加到包中?
$ 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']
答
sys.modules
被用作用于在解释所有导入的模块高速缓存,所以它应该含有无论进口它们从进口的位置的所有模块。
编辑:感谢评论,我意识到我没有回答真正的问题,这就是为什么pkga.logging
和pkga.types
在列表中?
正如@vikki指出的,这样可以防止在使用与标准库中的某个其他模块相同的模块名称时发生问题。例如,如果在pkga
下创建了logging.py
或types.py
,则sys.modules
的密钥不会更改。然而,pkga.logging
和pkga.types
的值不再是标准模块,而是在该包中实现的模块。
但是为什么它包含'pkga.logging'和'pkga.types'而不是'logging'和'types'? – 2012-02-09 07:29:02
@ IgnacioVazquez-Abrams保留名称空间。如果另一个模块实现了一个名为'logging'的类或函数,那么应用程序可能会因混乱而崩溃 – vikki 2012-02-09 07:39:49
@ IgnacioVazquez-Abrams我认为vikki是正确的。如果在'pkga'下创建'logging.py','sys.modules'将具有相同的密钥,但'pkga.logging'将是一个完全不同的模块。 – jcollado 2012-02-09 07:45:15