python – 具有模块导入的命名空间
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 具有模块导入的命名空间,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2161字,纯文字阅读大概需要4分钟。
内容图文
![python – 具有模块导入的命名空间](/upload/InfoBanner/zyjiaocheng/714/5f2762cd3c8c4658b23c2912626e3aba.jpg)
我正在学习Python,我仍然是初学者,虽然我已经研究了大约一年了.我正在尝试编写一个在主模块中调用的函数模块.被调用模块中的每个函数都需要运行数学模块.我想知道是否有办法在不调用被调用模块内的数学模块的情况下执行此操作.这是我有的:
main.py:
from math import *
import module1
def wow():
print pi
wow()
module1.cool()
module1.py:
def cool():
print pi
运行main.py时,我得到:
3.14159265359
Traceback (most recent call last):
File "Z:\Python\main.py", line 10, in <module>
module1.cool()
File "Z:\Python\module1.py", line 3, in cool
print pi
NameError: global name 'pi' is not defined
我很难理解的是运行main.py时出现名称错误的原因.我知道变量pi在导入时变为主模块的全局变量,因为哇可以访问它.我也知道,在导入时,酷变为主模块的全局,因为我可以打印module1.cool并获得<函数cool在0x02B11AF0>.因此,酷是在主模块的全局命名空间内,不应该程序首先在变量pi的函数内部查看,然后当它找不到它时,在主模块中查找变量pi并查找在那里?
解决这个问题的唯一方法就是在module1.py中导入math模块.我不喜欢这个想法,但是因为它使事情变得更复杂,而且我喜欢漂亮,简单的代码.我觉得我很接近掌握命名空间,但需要帮助.谢谢.
解决方法:
正如回溯所示,问题不在main.py中,而是在module1.py中:
Traceback (most recent call last):
File "Z:\Python\main.py", line 10, in <module>
module1.cool()
File "Z:\Python\module1.py", line 3, in cool
print pi
NameError: global name 'pi' is not defined
换句话说,在module1中,没有全局名称pi,因为您没有在那里导入它.当您从main.py中的math import *进行操作时,它只是将数学模块命名空间中的所有内容导入主模块的命名空间,而不是导入到每个模块的命名空间中.
我认为你在这里缺少的关键是每个模块都有自己的“全局”命名空间.起初这可能有点令人困惑,因为在像C这样的语言中,所有外部变量和函数共享一个全局命名空间.但是一旦你超越了这个假设,Python的方式就变得非常有意义了.
因此,如果你想使用module1中的pi,你必须在module1.py中进行数学导入*. (或者你可以找到一些其他方式来注入它 – 例如,module1.py可以从主导入*,或者main.py可以执行module1.pi = pi等.或者你可以将pi填入魔法内置函数/ __ builtin__模块,或使用各种其他技巧.但显而易见的解决方案是在您想要导入的地方进行导入.)
作为旁注,除了交互式解释器或偶尔使用顶级脚本之外,您通常不希望从foo import *做任何事情.有一些例外(例如,一些模块明确地设计为以这种方式使用),但经验法则是导入foo或使用受限制的foo导入栏,baz.
内容总结
以上是互联网集市为您收集整理的python – 具有模块导入的命名空间全部内容,希望文章能够帮你解决python – 具有模块导入的命名空间所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。