带有子模块导入的名称空间

Dshanahan

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

- foo
  - __init__.py
  - bar.py
  - baz.py

__init__.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']

我知道我可以扩展列表理解__all__以过滤掉,ModuleType但是我想知道为什么行为对于我自己的模块是不同的。我真的很希望能够使用领先的下划线来处理此问题,就像处理其他软件包一样。我也尝试使用dir()locals()vars()来代替,globals()但结果是相同的。

更新
出于好奇,我也进口foobarbar.py和印刷globals()'bar'没有被包括在内。因此,看来我的模块仅添加到__init__.py文件内的名称空间中了吗?

alex_noname

在评论中所有@MisterMiyagi的积分。

我只会用官方文件5.4.2中的报价来确认这一点子模块

使用任何一种机制加载子模块时,都会在父模块的名称空间中放置与子模块对象的绑定

例如,在您的情况下,如果packagefoo带有子模块bar,则在导入后foo.barfoo将具有bar绑定到submodule的属性foo.bar

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

避免模块名称空间中的子模块和外部软件包

来自分类Dev

导入具有通用名称空间前缀的许多模块的简洁方法

来自分类Dev

git添加没有回购名称的子模块

来自分类Dev

Python:设置属于导入模块名称空间的变量

来自分类Dev

正确导入带有某些定义的模块,这些定义仅在限定名称下可见

来自分类Dev

如何在iPython中从名称空间隐藏导入的模块?

来自分类Dev

React导入具有声明名称空间的模块

来自分类Dev

从模块中导入具有其名称的子模块

来自分类Dev

重写子模块的历史记录后,带有子模块的存储库

来自分类Dev

VSTS git构建失败,并带有git子模块

来自分类Dev

带有“当前目录”导入的导入模块

来自分类Dev

Python子模块导入

来自分类Dev

从包中导入只有一个公共成员的子模块时,避免名称重复

来自分类Dev

导入模块名称的使用与导入模块的名称空间有何关系?

来自分类Dev

Python子模块导入

来自分类Dev

git添加没有回购名称的子模块

来自分类Dev

带有子模块的项目的git config代理

来自分类Dev

如何在Wiki中导入带有子模板的模板

来自分类Dev

带有子模块的Fortran子例程重载

来自分类Dev

在带有多个文件的ES6模块中创建名称空间。馊主意?

来自分类Dev

从git子模块导入(ImportError)

来自分类Dev

带有“当前目录”导入的导入模块

来自分类Dev

jenkins推送带有主仓库的子模块

来自分类Dev

如何将子模块导入父命名空间?

来自分类Dev

如何导入 webpack 子模块?

来自分类Dev

带有子模块的 Angular 4 路由

来自分类Dev

有效地从包的许多子模块中导入名称

来自分类Dev

是否有可能导入子模块的特定方式?

来自分类Dev

带有子模块的木偶运行阶段

Related 相关文章

热门标签

归档