Python 具有子模块导入的命名空间

Python 具有子模块导入的命名空间,python,python-3.x,namespaces,python-import,Python,Python 3.x,Namespaces,Python Import,我想用一个简单的列表理解来为我的包中的模块设置\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我注意到,当我从自己的一个模块导入某些内容时,模块名被添加到名称空间中,而不仅仅是我导入的内容。这与导入内置或第三方软件包时不同 - foo - __init__.py - bar.py - baz.py \uuuu init\uuuuu.py import os as _os from numpy.ra

我想用一个简单的列表理解来为我的包中的模块设置
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。我注意到,当我从自己的一个模块导入某些内容时,模块名被添加到名称空间中,而不仅仅是我导入的内容。这与导入内置或第三方软件包时不同

- foo
  - __init__.py
  - bar.py
  - baz.py
\uuuu init\uuuuu.py

import os as _os

from numpy.random import randint as _randint

import foo.bar as _bar

from foo.baz import foobar

__all__ = [x for x in globals() if not x.startswith('_')]
我期望:

>>> import foo
>>> foo.__all__
['foobar']
但我得到:

>>> import foo
>>> foo.__all__
['bar', 'baz', 'foobar']
我知道我可以扩展我对
\uuuu all\uuuu
的列表理解,以过滤掉
模块类型
,但我想知道为什么我自己的模块的行为不同。我真的希望能够像处理其他包一样,使用一个前导下划线来处理这个问题。我还尝试使用
dir()
locals()
vars()
代替
globals()
,但结果是一样的

更新

出于好奇,我还将
foobar
导入到
bar.py
中,并打印了
globals()
“bar”
。因此,我的模块似乎只添加到
\uuu init\uuuuuuy.py
文件中的名称空间?

注释中的@MisterMiyagi的所有学分

我将仅引用官方文件中的一段话来确认这一点:

使用任何机制加载子模块[…]时,会在父模块的命名空间中放置到子模块对象的绑定


例如,在您的情况下,如果包
foo
有一个子模块
bar
,则导入
foo.bar
后,
foo
将有一个属性
bar
,该属性绑定到子模块
foo.bar

请记住,子模块本身就是其父模块的属性。例如,
concurrent.futures
就是
concurrent
.futures
属性。在您的例子中,
foo
包含
baz
,因为后者实际上是
foo.baz