これらのコマンドが実際に何をするかを考えれば、それは非常に簡単です。
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に入れるので、あなたができるのと同じように、あなたもすることができます。b
a
bar
a
from a import *
a
c
foo
bar
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