这是一个简单的例子:我想在python名称中定义一个模块。所以,我有一个名为robot的文件夹,包含这两个文件:
__ 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
?
答案 0 :(得分:0)
您不仅创建了模块,还创建了一个包。包在其命名空间中包含其子模块(一旦导入它们,就像您在此处导入test
一样)。这是应该的,因为使用包的通常方式是提供几个模块的分组。制作一个只包含一个模块(即一个内容.py
文件)的包没有多大用处。
如果您只想要一个单文件模块,只需创建一个名为robots.py
的文件并将代码放在那里。
修改:请参阅this previous question。答案是,您通常不必担心从包命名空间中排除模块名称。模块假设位于包名称空间中。如果你想从子模块中添加函数和东西,为了方便起见,那很好,但是通过“覆盖你的轨道”并隐藏你导入的模块并没有什么可以获得的。但是,如该问题的答案中所述,有一些黑客方法可以近似你想要的东西。
答案 1 :(得分:0)
您是否只是询问如何导入特定的模块或功能?
test.py:
import robot.spam.a
import robot.ham
不要导入整个包。