2017-02-22 1 views
0

このようにしてpkgというパッケージを作成しました。以下__all__が定義されていない場合でも、pkg import *からモジュールをインポートするのはなぜですか?

$ tree 
. 
└── pkg 
    ├── foo.py 
    └── __init__.py 

1 directory, 2 files 
[email protected]:~/so$ cat pkg/__init__.py 
[email protected]:~/so$ cat pkg/foo.py 
print('executing module foo ...') 

def bar(): 
    print('bar') 

すべてのPythonシェルスニペットは、Pythonインタプリタを備えた単一の対話型 セッションからです。私はそれらを複数のブロック ブロックに分割して、それらの間に自分の解説を追加しました。

ここは私のPythonバージョンです。

Python 3.4.2 (default, Oct 8 2014, 10:45:20) 
[GCC 4.9.1] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 

__all____init__.pyで定義されて ではないので、次のインポートがfooをインポートしません。

>>> from pkg import * 
>>> foo.bar() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'foo' is not defined 
>>> 

上記の動作は https://docs.python.org/3/tutorial/modules.html#importing-from-a-packageでPythonのチュートリアルに記載されています。

__all__が定義されていない場合、文のfrom sound.effects import * が 現在の名前空間にパッケージsound.effectsからすべてのサブモジュールをインポートしません。 __init__.pyに初期化コードを実行している可能性があります) パッケージがインポートされたことを確認してから、 パッケージに定義されている名前をインポートします。

以下の輸入品のみがbar()です。 fooはインポートされません。

>>> from pkg.foo import bar 
executing module foo ... 
>>> bar() 
bar 
>>> foo.bar() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'foo' is not defined 

しかし、不思議なこと、以前のインポート後に、次のインポートは__all____init__.pyで定義されていない場合でも、fooをインポート を終了します。

>>> from pkg import * 
>>> foo.bar() 
bar 

どうしてですか?

答えて

0

あなたが唯一のモジュールfooなどfoo__init__.pyない機能をインポートするfrom pkg import *使用するときに、引用Pythonドキュメントのオフに基づいて。

私は最後のコードを疑うあなたは、厳密バー機能がfoobar()間の接続を確立し、インポートした後、あなたがすでにfoofooを再インポートから直接bar()を輸入しているので、あなたが作品を提供スニペット。

__all__を指定すると、同じ問題が発生しますか?

+0

' ''モジュールfoo'をインポートするべきではありません。 '__all__'が指定されている場合、私は同じ問題に遭遇しません。私が興味を持っているのは、 'from pkg import *'の最初の出現がドキュメンテーションと一致する、つまり 'foo'をインポートしないのですが、' from pkg import * 'の2回目の出現はドキュメンテーションに違反し、' foo'をインポートします。 –

0

foofrom pkg.foo import barを実行すると、pkg名前空間にはすでにpkg.fooという名前空間にインポートされています。したがって、pkg名前空間から現在のスコープにすべての名前をインポートすると、fooもインポートされます。参照:__all__`が定義されていない限り、 `

>>> import pkg 
>>> dir(pkg) 
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__'] 
>>> from pkg.foo import bar 
executing module foo ... 
>>> dir(pkg) 
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'foo'] 

(私はpythonの2日午前しかし、このためのロジックは同じです)PKGのインポート*から

関連する問題