问候! 我正在制作一个简单的蛇游戏。我想在不同的模块e.i中扩展我的课程。在我的主游戏循环的单独脚本中有菜单类。换句话说,我希望我的导入脚本采用之前在主脚本中调用的pygame init。
以下是使用我的问题的伪代码的快速示例:
one.py
def version():
print pygame.version
在main.py中,我导入了pygame并执行了pygame.init()。从这里开始,我还想使用one.py
中的def version()main.py
import pygame
import one
pygame.init()
one.version()
然而,它给了我没有pygame定义的错误。我知道它给我一个错误的原因是因为当从main.py中调用one.py时,它不会保留main.py中的声明。
我想知道的是一种实现上述实际工作的方法。
谢谢!
答案 0 :(得分:3)
导入模块X的模块的导入不会泄漏到X的命名空间(这是一件好事 - 它需要动态范围或C / C ++ - 样式#include
,两者几乎都没用而且往往甚至是有害的)。它本身就是一个完全独立的命名空间。如果您想在模块中使用某些内容(例如pygame
)(例如one
),请将其导入。
答案 1 :(得分:1)
Python的导入模型如下:如果模块a.b.c
中需要模块d.e.f
,则在import a.b.c
的开头添加d/e/f.py
(或类似)。 (这类似于Java的导入工作方式。)因此,如果您有许多模块(例如d.e.f1
,d.e.f2
,...)需要许多模块(例如a.b.c1
,{{1然后,您应该从每个模块中导入每个必需的模块,从而在模块源文件中生成相同a.b.c2
语句的多个副本。看起来更紧凑的导入模型(你必须只导入一次相同的模块)会更好,但这有一个非常重要的缺点:紧凑的导入模型将使用全局命名空间,它会进行依赖性跟踪(例如谁需要这个代码?这个代码来自哪里?)更难。因此,每当您编写一个您认为不必要的导入行时,请记住这是您为可维护代码支付的(小)价格。