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
命名空间包括test
和a
。但是,我只希望它包含a
。为什么会有这种奇怪的行为?
编辑:
这是我想要实现的一个更具代表性的示例:
给定以下文件:
__init__.py:
from spam import a
import ham
spam.py:
a = "hello world"
ham.py:
b = "foo"
我可以有一个robot
命名空间,在其顶层包含a
和ham
,但不包含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 文件)。在机器人内部定义a
、test
、ham
和spam
。然后您将拥有robot.a
、robot.spam
、robot.ham
等。对于您想要做的事情,请将所有内容放在同一个目录中。
有道理,但实际上整个事情是〜10k loc。把它分成子模块方便组织,我并不总是需要导入所有东西(有时我只需要火腿)。以上是关于Python:从模块导入 * 在 __init__的主要内容,如果未能解决你的问题,请参考以下文章