Python 使用导入脚本中的Pygame模块

Python 使用导入脚本中的Pygame模块,python,namespaces,import,pygame,Python,Namespaces,Import,Pygame,你好! 我正在制作一个简单的蛇游戏。我想在不同的模块中扩展我的类,例如,在我的主游戏循环中有一个单独的脚本中的菜单类。换句话说,我希望我导入的脚本采用pygame init,它在主脚本的前面被调用 下面是一个使用我的问题的伪代码的快速示例: 1.py def version(): print pygame.version 在main.py中,我导入了pygame并执行了pygame.init()。在这里,我还想使用one.py中的def version() main.py import

你好! 我正在制作一个简单的蛇游戏。我想在不同的模块中扩展我的类,例如,在我的主游戏循环中有一个单独的脚本中的菜单类。换句话说,我希望我导入的脚本采用pygame init,它在主脚本的前面被调用

下面是一个使用我的问题的伪代码的快速示例:

1.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中的声明

我想知道的是实现上述目标的一种方法


谢谢大家!

导入模块X的模块的导入不会泄漏到X的名称空间(这是一件好事——它要么需要动态作用域,要么需要C/C++风格的
#include
,两者几乎都没有用处,甚至有害)。它是一个完全独立的名称空间。如果您想在模块(例如,
one
)中使用某些内容(例如,
pygame
),请将其导入该模块。

导入模块X的模块的导入不会泄漏到X的命名空间(这是一件好事-它可能需要动态作用域或C/C++风格的
#include
,两者几乎都没有用处,甚至常常有害)。它本身就是一个完全独立的命名空间。如果您想在模块中使用某个东西(例如
pygame
),则(例如
one
)Python的导入模型如下:如果您的模块
d.e.f
中需要模块
a.b.c
,那么在
d/e/f.py
的开头添加一个
import a.b.c
(或类似的内容)(这类似于Java的导入工作方式)。因此,如果您有许多模块(例如,
d.e.f1
d.e.f2
,…)需要许多模块(例如,
a.b.c1
a.b.c2
,…),然后您应该从每个模块导入每个所需的模块,从而在模块源文件中生成相同的
import
语句的多个副本。这看起来是一个更紧凑的导入模型(只需导入同一个模块一次)会更好,但这有一个非常重要的缺点:紧凑导入模型将使用全局名称空间,并且会进行依赖项跟踪(例如,谁需要此代码?此代码来自何处?)更难。所以每次你写一行你认为不必要的导入代码时,记住这是你为可维护代码付出的(小)代价。

Python的导入模型如下:如果你在你的模块
d.e.f
中需要模块
a.b.c
,那么就添加一个
import a.b.c
(或类似)到
d/e/f.py
(这与Java的导入工作方式类似)的开头,因此如果您有许多模块(例如
d.e.f1
d.e.f2
,…),它们需要许多模块(例如
a.b.c1
a.b.c2
,…),然后您应该从每个模块导入每个所需的模块,从而在模块源文件中生成相同的
import
语句的多个副本。这看起来是一个更紧凑的导入模型(只需导入一次相同的模块)这样会更好,但这有一个非常重要的缺点:紧凑型导入模型将使用全局名称空间,这将使依赖项跟踪(例如,谁需要此代码?此代码来自何处?)更加困难。因此,每次编写您认为不必要的导入行时,请记住这是(小的)您为可维护代码付出的代价。

我已经想到了这一点;但它是否有效?如果我真的这样做,我将不得不在每个模块中导入Pygame(必要时)。也许如果我创建了一个单独的模块,该模块在调用时具有导入Pygame的功能?@user577317:是的,它是有效的。创建单独的模块是毫无意义的,因为将不得不导入该名称。@user577317:您不能操纵调用方的名称空间(嗯,也许可以,但这将是一种不可靠的黑客行为,需要大量的工作,而且从一开始就不是一个好主意)。看在上帝的份上,只需导入它们。这个问题是另一个例子,说明为什么不理解的优化是毫无意义和有害的;)导入一个已经导入的模块(在当前运行的解释器过程中-当然,您通常只有一对一的程序)只是给你一个已经导入模块的参考。也就是说,没有低效。我已经考虑过了;但是它有效吗?如果我这样做的话,我必须根据需要在每个模块中导入Pygame。也许如果我创建了一个单独的模块,该模块有一个调用时导入Pygame的函数?@user577317:是的,它是有效的。创建一个单独的模块模块是没有意义的,因为您必须导入它。@user577317:您不能操纵调用方的名称空间(好吧,也许您可以,但这将是一种不可靠的黑客行为,需要大量的工作,而且从一开始就不是一个好主意)。看在上帝的份上,只需导入它们。这个问题是另一个例子,说明为什么不理解的优化是毫无意义和有害的;)导入一个已经导入的模块(在当前运行的解释器过程中-当然,您通常只有一对一的程序)只是给你一个已经导入模块的参考。也就是说,没有低效。嗯…有趣。谢谢你的建议,我会记住的。嗯…有趣。谢谢你的建议,我会记住的。