我正在学习Python,尽管我已经学习了大约一年,但我仍然是一个初学者。我正在尝试编写一个在主模块中调用的函数模块。被调用模块中的每个函数都需要数学模块才能运行。我想知道是否有一种方法可以在不将数学模块导入被调用模块内的情况下执行此操作。这是我所拥有的:
main.py
:
from math import *
import module1
def wow():
print pi
wow()
module1.cool()
module1.py
:
def cool():
print pi
跑步时main.py
I get:
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
导入后成为主模块的全局变量,因为wow
可以访问它。我也知道cool
导入后成为主模块的全局变量,因为我可以打印module1.cool
并得到<function cool at 0x02B11AF0>
。所以自从cool
位于主模块的全局命名空间内,程序不应该首先查看函数内部cool
对于变量pi
,然后当它在那里找不到它时,看看里面main
变量模块pi
and find it there?
据我所知,解决这个问题的唯一方法是将数学模块导入其中module1.py
。但我不喜欢这个想法,因为它使事情变得更加复杂,而且我喜欢漂亮、简单的代码。我觉得我已经接近掌握命名空间了,但在这方面需要帮助。谢谢。
正如回溯所示,问题不在于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
换句话说,in module1
,没有全局名称pi
,因为你还没有在那里导入它。当你这样做时from math import *
in main.py
,这只是从导入所有内容math
模块的命名空间放入main
模块的命名空间,而不是进入every模块的命名空间。
我认为您在这里缺少的关键是每个模块都有自己的“全局”名称空间。一开始这可能会有点令人困惑,因为在像 C 这样的语言中,有一个由所有语言共享的全局命名空间extern
变量和函数。但一旦你克服了这个假设,Python 的方式就完全有意义了。
所以,如果你想使用pi
from module1
,你必须做from math import *
in module1.py
。 (或者你可以找到其他方法来注入它 - 例如,module1.py
可以做from main import *
, or main.py
可以做module1.pi = pi
等等,或者你可以临时抱佛脚pi
进入魔法builtins
/__builtin__
模块,或使用各种其他技巧。但显而易见的解决方案是import
您想要将其导入到的位置。)
顺便说一句,你通常不想这样做from foo import *
除了交互式解释器或偶尔的顶级脚本之外的任何地方。也有例外(例如,一些模块明确设计为以这种方式使用),但经验法则是import foo
或使用有限的from foo import bar, baz
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)