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