从导入的脚本使用Pygame模块

时间:2011-01-16 09:28:10

标签: python namespaces import pygame

问候! 我正在制作一个简单的蛇游戏。我想在不同的模块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中的声明。

我想知道的是一种实现上述实际工作的方法。

谢谢!

2 个答案:

答案 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.f1d.e.f2,...)需要许多模块(例如a.b.c1,{{1然后,您应该从每个模块中导入每个必需的模块,从而在模块源文件中生成相同a.b.c2语句的多个副本。看起来更紧凑的导入模型(你必须只导入一次相同的模块)会更好,但这有一个非常重要的缺点:紧凑的导入模型将使用全局命名空间,它会进行依赖性跟踪(例如谁需要这个代码?这个代码来自哪里?)更难。因此,每当您编写一个您认为不必要的导入行时,请记住这是您为可维护代码支付的(小)价格。