1

これは、pythionのインポートでは完全には理解できないものです。モジュール'b'を'importb'でインポートするモジュール'a'があるとしましょう。次に、モジュール'a'をインポートするモジュール'c'があります。モジュール「b」を形成する名前は「c」で使用できますか?

モジュール「c」にモジュール「a」をインポートする方法に実際に依存することを確認しました。'import a'を実行すると、'b'の名前は'c'で使用できなくなります。ただし、「インポート*」から実行すると、それらが使用可能になります。誰かplsは違いを明確にすることができますか?

4

3 に答える 3

4

これらのコマンドが実際に何をするかを考えれば、それは非常に簡単です。

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

于 2013-01-10T22:11:01.363 に答える
3

このimportステートメントにより、モジュールが実行され、すべての変数が実行されたモジュールの名前空間に保持されます。つまり、の場合import a、のすべてaの変数はの下になりますa.[variable]。キーワードのfrom動作は少し異なります。変数を現在の名前空間に配置します。たとえばfrom a import foo、変数fooを現在の名前空間に配置します。すべての変数をから現在の名前空間にfrom a import *インポートします。キーワードを使用すると、変数をインポートするときに変数aの名前を変更できます。asしたがってfrom a import foo as bar、にアクセスできますがa.foo、呼び出す必要がありますbar; import a.foo as fooと同等from a import fooです。

于 2013-01-10T22:15:47.463 に答える
1

上記よりも具体的な例:

a.py

import b
bar = 'bar'

b.py

foo = 'foo'

c.py

import a


try:
   print(b.foo)
except:
   print('No `b` in current namespace')

try:
   print(a.bar)
except:
   print('No `a` in current namespace')

try:
   print(a.b.foo)
except:
   print('No `a` or `a.b` in current namespace')

これは(順番に)印刷する必要があります:

No `b` in current namespace
bar
foo

言い換えると、bはaを介して利用できますが、aの名前空間にアクセスすることによってのみ利用できます。

于 2013-01-10T22:21:06.840 に答える