python - 有关 Python 命名空间和使用 import 的问题

标签 python

我今天正在使用 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 模块,然后使用你想要的部分,或者为什么你必须别名测试(导入 mytest.test 作为测试)才能访问它而不是仅仅导入 mytest。测试(导入 mytest.test)?

我想我的理解有点偏差,但一些解释确实会有帮助。 谢谢!

最佳答案

当你这样做时:

import mytest.test

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

import mytest.test

mytest.test.say_hello()

如果您只想使用 import mytest 行,则需要编辑 mytest 目录中的 __init__.py 文件说:

import mytest.test

然后你可以这样做:

import mytest

mytest.test.say_hello()

关于python - 有关 Python 命名空间和使用 import 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19480540/

相关文章:

python - 默认为 None 的参数是否应该始终被类型提示为Optional[]?

python - 使用 Python 从字符串中提取整数

python - 为什么这个 `random()`只执行一次?

python - 有什么方法可以减小 python 2.7.6 数据包的大小(不需要的文件夹或不需要的文件夹或 python 包中不需要的文件夹))

python - 开普勒数据 - Python 不稳定问题

python - 谷歌数据流/Python : Import errors with save_main_session and custom modules in __main__

python - rpyc.Service 需要 10 秒来接收 150kB 的对象(在本地主机上,没有 LAN 问题)

Python最长/平均 'losing'以字符串中的二进制数字序列运行

python - 如何在函数中使用局部变量并返回它?

python - 在 python 中读取属性文件的快速方法是什么?