【问题标题】:Using Pygame Module from imported script从导入的脚本中使用 Pygame 模块
【发布时间】:2011-01-16 09:28:10
【问题描述】:

您好! 我正在创建一个简单的蛇游戏。我想在不同的模块中扩展我的课程,例如在与我的主游戏循环不同的脚本中有菜单类。换句话说,我希望我导入的脚本采用之前在主脚本中调用的 pygame init。

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

一个.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()

但是,它给了我 no pygame defined 错误。我知道它给我一个错误的原因是因为当从 main.py 中调用 one.py 时,它不保留 main.py 中的声明。

我想知道的是一种真正可行的方法。

谢谢!

【问题讨论】:

    标签: python namespaces import pygame


    【解决方案1】:

    导入模块 X 的模块的导入不会泄漏到 X 的命名空间(这是一件好事 - 它需要动态范围或 C/C++ 风格的#include,两者几乎都没有用,而且经常甚至有害)。它本身就是一个完全独立的命名空间。如果您想在模块(例如one)中使用某些东西(例如pygame),请将其导入那里。

    【讨论】:

    • 我已经想到了;但它有效吗?如果我真的走那条路,我必须根据需要在每个模块中导入 Pygame。也许如果我创建了一个单独的模块,该模块具有在调用时导入 Pygame 的函数?
    • @user577317:是的,它很有效。创建一个单独的模块是没有意义的,因为你必须导入它。
    • @user577317:你不能操纵调用者的命名空间(好吧,也许你可以,但这是一个不可靠的黑客行为,需要大量的工作,而且一开始是个坏主意)。 只是导入它们,看在上帝的份上。这个问题是另一个例子,说明为什么没有理解的优化是毫无意义和有害的;)导入一个已经导入的模块(在当前运行的解释器进程中——当然,你通常只有一个程序)只是给你一个参考已经导入的模块。 IE。没有效率低下。
    【解决方案2】:

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

    【讨论】:

    • 嗯...有趣。谢谢你的建议,我会记住的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多