これらのコマンドが実際に何をするかを考えれば、それは非常に簡単です。
a.py:
import b
foo = 0
b.py:
bar = 1
c.py:
import a
からc、あなたはただ言うことはできませんfoo、あなたは言わなければなりませんa.foo。同じことが、a定数、変数、関数、クラス、さらにはモジュールのすべての名前にも当てはまります。そしてそれは含まれていますb。
だから、あなたはbarまたはa.barを言うことはできませんが、あなたは言うことができますa.b.bar。
さて、このように変更するとどうなりますか?
a.py:
from b import *
foo = 0
b.py:
bar = 1
c.py:
from a import *
これは、の名前空間from b import *内のすべてを取得し、それをの名前空間に配置することです。これにより、内から直接言うことができます。そして、あなたがそうするとき、それはすべてを's名前空間に取り、それを' sに入れるので、あなたができるのと同じように、あなたもすることができます。babarafrom a import *acfoobar
from b import *これが、名前空間がすべて一緒にマージされるため、通常、トップレベルのスクリプト以外の場所で実行したくない理由です。
それはまたあなたがで拾われるものを制限することができる理由*です__all__:
a.py:
from b import *
__all__ = ['foo']
foo = 0
b.py:
bar = 1
c.py:
from a import *
さて、からc、できますがc.foo、できませんc.bar。
したがって、すべての内部をユーザーに公開することなく、独自の機能を実装するaことができます。from b import *b