2012-02-09 46 views
1

爲什麼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'] 

回答

1

sys.modules被用作用於在解釋所有導入的模塊高速緩存,所以它應該含有無論進口它們從進口的位置的所有模塊。

編輯:感謝評論,我意識到我沒有回答真正的問題,這就是爲什麼pkga.loggingpkga.types在列表中?

正如@vikki指出的,這樣可以防止在使用與標準庫中的某個其他模塊相同的模塊名稱時發生問題。例如,如果在pkga下創建了logging.pytypes.py,則sys.modules的密鑰不會更改。然而,pkga.loggingpkga.types的值不再是標準模塊,而是在該包中實現的模塊。

+0

但是爲什麼它包含'pkga.logging'和'pkga.types'而不是'logging'和'types'? – 2012-02-09 07:29:02

+0

@ IgnacioVazquez-Abrams保留名稱空間。如果另一個模塊實現了一個名爲'logging'的類或函數,那麼應用程序可能會因混亂而崩潰 – vikki 2012-02-09 07:39:49

+0

@ IgnacioVazquez-Abrams我認爲vikki是正確的。如果在'pkga'下創建'logging.py','sys.modules'將具有相同的密鑰,但'pkga.logging'將是一個完全不同的模塊。 – jcollado 2012-02-09 07:45:15

相關問題