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

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 条评论
登录 后参与评论

相关文章

导入名称空间和子模块都有不利之处吗?例如import React,{Component} from ...

初始化/导入子模块而不会污染全局名称空间

子模块的python导入路径(如果放在名称空间包中)

分发名称空间包子模块

Angular2 Routing:导入带有路由的子模块,并使其带有前缀

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

如何包含带有react tsx导入的名称空间?

如何导入所有子模块?

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

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

带有内置库名称的子模块是一种好的样式吗?

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

模拟带有ReadTheDocs子模块

带有子模块的 Angular 4 路由

为什么带有子模块的模块和具有冲突名称的功能为何起作用?

如何使用__import__函数从子模块导入名称?

Typescript通配符将所有模块名称导入当前名称空间?

Python子模块导入

Python子模块导入

导入子模块的子模块上的ModuleNotFoundError

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

如何打包带有可选子模块的节点模块?

当模块名称中带有'-'破折号或连字符时,如何导入模块?

Python将所有内容从多个文件模块导入到名称空间

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

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

从ES6导入带有名称空间的旧JavaScript

正确的步骤/语法,将库导入带有名称空间的打字稿文件中

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