2013-05-28 71 views
1

这里是一个简单的例子:我想在python名称机器人中定义一个模块。所以,我有这两个文件命名为机器人的文件夹:Python:从模块导入*在__init__

__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" 

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

+0

'进口机器人'导入机器人包(目录)。由于您没有指定要导入的内容,因此将导入整个包。 – Andenthal

回答

0

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

如果你只是想要一个文件模块,只需创建一个名为robots.py的文件并将代码放在那里。

编辑:见this previous question。答案是,你通常不应该担心从你的包名称空间中排除模块名称。模块假定位于包名称空间中。如果你想从子模块中添加函数和东西,为了方便起见,这很好,但是“覆盖你的轨道”并隐藏你导入的模块并没有什么可以获得。然而,正如问题的答案中所描述的那样,有一些歪曲的方法来逼近你想要的东西。

+0

我明白了,谢谢。我编辑了我的原始帖子,以更具代表我实际想要达到的目标。我确实有一些子模块,但我也希望将一些功能暴露在顶层。有没有办法做到这一点? – user2364719

+0

@ user2364719:我编辑了我的答案。基本的答案是,虽然你可以对它进行破解,但你不应该担心从包名称空间中移除模块,因为模块*应该被放在包名称空间中。您可以将其他东西添加到包命名空间,但是包名称空间的基本用途是容纳模块,而Python不提供避免这种情况的直接方法。 – BrenBarn

+0

好了,我会从_core.py中导入“核心”功能,所以它是隐藏的。谢谢! – user2364719

0

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

测试。py:

import robot.spam.a 
import robot.ham 

请勿导入整个软件包。

+0

然后我会有robot.spam.a和robot.ham。对不起,不清楚,但我希望有一种“核心”文件,其中包括我想要在机器人包/模块的顶层提供的所有功能和类。 – user2364719

+0

使'robot'成为一个模块(一个.py文件)。在机器人内部定义'a','test','ham'和'spam'。然后你会拥有'robot.a','robot.spam','robot.ham'等。为了你想要做的事情,把所有东西放在同一个目录中。 – Andenthal

+0

有道理,但实际上整个事情是〜10k loc。在子模块中进行分离便于组织,而且我并不总是需要导入所有内容(有时候我只需要火腿)。 – user2364719