2

我今天正在玩 Python 并尝试创建自己的模块。看来我并不完全理解 Python 命名空间,我想知道是否有人可以回答我关于它们的问题。

这是我所做的一个例子:

我创建了一个名为 mytest 的模块,其结构如下:

mytest/
....setup.py
....bin/
....docs/
....mytest/
........__init__.py
........test.py
....tests/

test.py 包含一种方法,如下所示:

def say_hello():
    print "Hello"

我已经通过 distutils 安装了 mytest。使用 'pip list' 我可以看到模块已安装。

到目前为止一切正常,但现在我想使用它。我创建了一个测试脚本moduletest.py:

from mytest import test

test.say_hello()

并且运行正常,打印“Hello”消息。我对此很满意,并开始尝试其他导入模块的方法。

以下一切似乎都可以正常工作:

from mytest.test import say_hello

say_hello()

和:

import mytest.test as test

test.say_hello()

但是,以下将不起作用:

import mytest

test.say_hello()

和:

import mytest

mytest.test.say_hello()

和:

import mytest.test

test.say_hello()

谁能解释为什么你不能导入整个 mytest 模块然后使用你想要的部分,或者为什么你必须别名 test (import mytest.test as test) 才能访问它而不是仅仅导入 mytest.test (import mytest.test)?

我想我的理解有点偏离,但一些解释真的会有所帮助。谢谢!

4

2 回答 2

3

当你这样做时:

import mytest.test

它添加mytest.test到全局命名空间,而不是test. 所以你可以做的是:

import mytest.test

mytest.test.say_hello()

如果您只想使用 line import mytest,您需要在目录中编辑__init__.py文件mytest以说明:

import mytest.test

然后你可以这样做:

import mytest

mytest.test.say_hello()
于 2013-10-20T17:36:51.857 回答
1

from..import表示法有效,因为您是从包中导入的,这并不意味着模块在该包的“命名空间”中,它只是意味着它们在包中。

尝试在 mytest 中执行此操作

from . import test

然后做

import mytest
mytest.test.say_hello()

它将起作用,因为“test”将被导入包命名空间。

于 2013-10-20T17:41:06.640 回答