2

foo次のパッケージがあるとします__init__.py

from bar import *

とともにbarインストールされた任意の python モジュールですpip install bar

インポートできるときに常に機能するのは次のbarとおりです。

from bar import submodule #works
import bar.submodule      #works, too

ここで、次のこともすべてうまくいくと思います。

from foo import submodule     # a) is possible
import foo.submodule          # b) not possible ("no module named submodule")
from foo.bar import submodule # c) also impossible ("no module named submodule")

なぜそれらは不可能なのですか?fooメンテナーの観点から、それらを可能にするために何をする必要がありますか?

4

1 に答える 1

2

submoduleおよびbarfooモジュールオブジェクトのメンバーであり、そのサブモジュールではありません。したがって、これらは。の他のメンバー属性と同じように動作しますfoo。これらをフォームを使用して3番目のモジュールのモジュール名前空間に取り込むことはできますが、に直接関連付けるfrom foo import ...ことはできません。手動で目的の名前でハッキングすれば可能だと思いますが、実際にはそのようなことをするべきではありません...importfoosys.modules

問題を説明するには:

foo.py

# x and y are values in the foo namespace, available as member attributes
# of the foo module object when foo is imported elsewhere
x = 'x'
y = 'y'

bar.py

# the foo module object is added as a member attribute of bar on import
# with the name foo in the bar namespace
import foo
# the same foo object is aliased within the bar namespace with the name
# fooy
import foo as fooy
# foo.x and foo.y are referenced from the bar namespace as x and y,
# available as member attributes of the bar module object
from foo import x, y
# z is a member attribute of the bar module object
z = 'z'

baz.py

# brings a reference to the x, y, and z attributes of bar (x and y
# come in turn from foo, though that's not relevant to the import;
# it just cares that bar has x, y, and z attributes), in to the
# namespace of baz
from bar import x, y, z
# won't work, because foo is a member of bar, not a submodule
import bar.foo
# will work, for the same reason that importing x, y, and z work
from bar import foo
于 2013-01-29T15:34:58.663 に答える