有人可以解释这个奇怪的Pygame导入约定吗?

时间:2012-04-26 15:07:27

标签: python import pygame

我看到人们通常会像这样导入Pygame:

import pygame
from pygame.locals import *

我不明白第二行是什么。如果我们已经导入了整个Pygame,为什么要导入pygame.locals? Pygame一旦导入就不会包含它吗?

6 个答案:

答案 0 :(得分:6)

import pygame

将pygame模块导入“pygame”命名空间。

from pygame.locals import *

将pygame.locals中的所有名称复制到当前名称空间中。这不是必要的,但可以节省您的输入。

答案 1 :(得分:5)

实际上,来自pygame docs

  

该模块包含Pygame使用的各种常量。它的内容自动放在pygame模块命名空间中。但是,应用程序可以使用pygame.locals仅包含带有'from pygame.locals import *'的Pygame常量。

因此,当您使用import pygame时,所有这些常量都已存在。如果我们这样做,我们可以看到这个:

>>> import pygame
>>> from pygame.locals import *
>>> set(dir(pygame.locals)).issubset(set(dir(pygame)))
True

所以,pygame.localsimport pygame的一个子集。如果你已经导入了pygame,那么绝对没有意义!除此之外,您还可以在不使用pygame前缀的情况下访问它们。

答案 2 :(得分:2)

执行时

import pygame

pygame完全导入并准备工作,不再需要导入。

现在的问题是关于这一行:

from pygame.locals import *

为什么要这样做有几个原因,有几个理由不这样做。

  1. 效果。当您键入foo.bar.baz.ClassName.classmethod()之类的内容时,命名空间中将有4次查找,这需要花费一些时间。代码中的这些行越多,浪费的时间就越多。
  2. 简单。当您编写教程时,您会尝试尽可能简单地解释事物。所以代码越少,教程越好。
  3. 轻松。当您键入代码时,会将其分散到不同的文件中。因为使用较小的side文件更容易,然后在main中导入所有这些文件。但是你完全理解你要导入的内容。
  4. Namespase污染。当您将所有内容从模块导入全局变量时,您在全局变量的选择上受到更多限制。例如,from struct import *您无法将您的职能命名为pack。因此,在使用此类导入之前,您应该探索该模块。它包含什么?它本身导入什么?
  5. 消息当您多次使用此类导入from foo import *from bar import *以及from baz import *时,某些变量或常量可能会被着色或覆盖。在此示例中,foo.versionbar.version覆盖,现在名为version。因此,foo.checkversion()将无法正常工作。
  6. 正确的方法是以显式形式导入常用函数,或者使它们成为快速参考,特别是当您不熟悉模块时。

    例如:

    from foo.bar.baz import a_very_useful_function
    

    import foo.bar.baz
    quick_referenced_fn = foo.bar.baz.a_very_useful_function
    

    此处quick_referenced_fn仍为foo.bar.baz.a_very_useful_function并且在foo.bar.baz的命名空间中工作,但解释器直接知道其地址,不会进行其他查找。

答案 3 :(得分:1)

import pygame
from pygame.locals import *

http://www.pygame.org/docs/tut/ImportInit.html

这里的第一行是唯一必需的。它将所有可用的pygame模块导入到pygame包中。第二行是可选的,并将一组有限的常量和函数放入脚本的全局命名空间中。

答案 4 :(得分:1)

  

Pygame在导入后是否已经包含它?

不。不必要。

stefanos-imac:python borini$ touch a/__init__.py
stefanos-imac:python borini$ touch a/b.py
stefanos-imac:python borini$ echo "print 'hello' " >a/b.py 
stefanos-imac:python borini$ python
Python 2.7.1 (r271:86832, Jul 31 2011, 19:30:53) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import a
>>> import a.b
hello
>>> 

答案 5 :(得分:0)

我不担心。我知道你可能被告知*进口不好。这在某种程度上是正确的,除非Pygame开发人员明确定义了__all__属性,在这个属性中他们已经将所有那些方便的花花公子常量放入其中,并且他们有。因此,他们通过这种方式使这个特定的*导入安全。

*__all__属性相关,因此请在pygame.locals源代码中搜索__all__属性中包含的所有常量。