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
。