Python:从模块导入 * 在 __init__

Posted

技术标签:

【中文标题】Python:从模块导入 * 在 __init__【英文标题】:Python : from module import * in __init__ 【发布时间】:2013-05-23 22:49:51 【问题描述】:

这是一个简单的案例:我想在 python 名称机器人中定义一个模块。所以,我有一个名为 robots 的文件夹,里面有这两个文件:

__init__.py:

from test import a

test.py:

a = "hello world"

现在,当我在解释器中import robot 时,robot 命名空间包括testa。但是,我只希望它包含a。为什么会有这种奇怪的行为?


编辑:

这是我想要实现的一个更具代表性的示例:

给定以下文件:

__init__.py:

from spam import a
import ham

spam.py:

a = "hello world"

ham.py:

b = "foo"

我可以有一个robot 命名空间,在其顶层包含aham,但不包含spam

【问题讨论】:

import robot 导入机器人包(目录)。由于您没有指定要导入的内容,因此会导入整个包。 【参考方案1】:

您不仅创建了一个模块,还创建了一个包。一个包在其命名空间中包含其子模块(一旦它们被导入,就像您在此处导入 test 一样)。这是应该的,因为使用包的通常方式是提供几个模块的分组。制作一个只包含一个模块(即,一个内容丰富的.py 文件)的包并没有多大用处。

如果您只想要一个单文件模块,只需创建一个名为 robots.py 的文件并将您的代码放入其中。

编辑:见this previous question。答案是您通常不应该担心从包命名空间中排除模块名称。这些模块应该在包命名空间中。如果您还想从子模块中添加功能和东西,为了方便起见,这很好,但是通过“覆盖您的踪迹”并隐藏您导入的模块并没有真正获得任何东西。但是,正如该问题的答案中所述,有一些粗略的方法可以近似您想要的内容。

【讨论】:

我明白了,谢谢。我已经编辑了我的原始帖子,以更能代表我真正想要实现的目标。我确实有一些子模块,但我也希望在顶层公开一些功能。有没有办法做到这一点? @user2364719:我编辑了我的答案。基本的答案是,虽然你可以破解它,但你不应该担心从包命名空间中删除模块,因为模块应该在包命名空间中。您可以向包命名空间添加其他内容,但包命名空间的基本目的是保存模块,Python 没有提供避免这种情况的直接方法。 好吧,我将从 _core.py 中导入“核心”功能,所以它有点隐藏。谢谢!【参考方案2】:

你只是问如何导入特定的模块或功能?

test.py:

import robot.spam.a
import robot.ham

不要导入整个包。

【讨论】:

然后我将拥有robot.spam.a 和robot.ham。抱歉不清楚,但我希望拥有一种“核心”文件,其中包含我希望在机器人包/模块的顶层可用的所有功能和类。 使robot 成为一个模块(一个.py 文件)。在机器人内部定义atesthamspam。然后您将拥有robot.arobot.spamrobot.ham 等。对于您想要做的事情,请将所有内容放在同一个目录中。 有道理,但实际上整个事情是〜10k loc。把它分成子模块方便组织,我并不总是需要导入所有东西(有时我只需要火腿)。

以上是关于Python:从模块导入 * 在 __init__的主要内容,如果未能解决你的问题,请参考以下文章

python __init__.py 文件的作用

Python:导入包含的包

Python 3:从***包导入模块

python基础:__init__.py和__init__函数的作用

在 Python 和 __init__.py 中导入模块

尽管有 __init__.py,Python 仍无法导入自定义模块