我看到人们通常会像这样导入Pygame:
import pygame
from pygame.locals import *
我不明白第二行是什么。如果我们已经导入了整个Pygame,为什么要导入pygame.locals
? Pygame一旦导入就不会包含它吗?
答案 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.locals
是import pygame
的一个子集。如果你已经导入了pygame,那么绝对没有意义!除此之外,您还可以在不使用pygame
前缀的情况下访问它们。
答案 2 :(得分:2)
执行时
import pygame
pygame完全导入并准备工作,不再需要导入。
现在的问题是关于这一行:
from pygame.locals import *
为什么要这样做有几个原因,有几个理由不这样做。
foo.bar.baz.ClassName.classmethod()
之类的内容时,命名空间中将有4次查找,这需要花费一些时间。代码中的这些行越多,浪费的时间就越多。from struct import *
您无法将您的职能命名为pack
。因此,在使用此类导入之前,您应该探索该模块。它包含什么?它本身导入什么?from foo import *
和from bar import *
以及from baz import *
时,某些变量或常量可能会被着色或覆盖。在此示例中,foo.version
被bar.version
覆盖,现在名为version
。因此,foo.checkversion()
将无法正常工作。正确的方法是以显式形式导入常用函数,或者使它们成为快速参考,特别是当您不熟悉模块时。
例如:
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__
属性中包含的所有常量。