submodule
并且bar
是foo
模块对象的成员,而不是它的子模块。因此,它们的行为与 的任何其他成员属性一样foo
。您可以使用表单将它们带入第三个模块的模块命名空间from foo import ...
,但不能直接import
将它们相对于foo
. 我想如果你sys.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