2012-02-09 10 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で指摘されているように、標準ライブラリの他のモジュールと同じモジュール名を使用しているときに問題が発生するのを防ぎます。たとえば、logging.pyまたはtypes.pypkgaの下に作成された場合、sys.modulesのキーは変更されません。しかし、pkga.loggingpkga.typesの値は、もはや標準モジュールではなく、そのパッケージに実装されたモジュールです。

+0

しかし、なぜ 'logging'と' types'の代わりに 'pkga.logging'と' pkga.types'が入っていますか? –

+0

@ IgnacioVazquez-Abramsは名前空間を保持します。別のモジュールが 'logging'というクラスや関数を実装すると、アプリケーションは混乱のためにクラッシュする可能性があります。 – vikki

+0

@ IgnacioVazquez-Abrams私はvikkiが正しいと思います。 'logging.py'が' pkga'の下で作成された場合、 'sys.modules'は同じキーを持ちますが、' pkga.logging'はまったく別のモジュールです。 – jcollado

関連する問題