我看到人们通常像这样导入 Pygame:
import pygame
from pygame.locals import *
我不明白第二行是什么。如果我们已经导入了整个 Pygame,为什么还要导入pygame.locals
呢?Pygame 不是在导入后就已经包含它了吗?
import pygame
将 pygame 模块导入“pygame”命名空间。
from pygame.locals import *
将 pygame.locals 中的所有名称复制到您当前的命名空间中。这不是必需的,但可以节省您的打字时间。
实际上,来自 pygame文档:
该模块包含 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
除此之外,您还可以在没有前缀的情况下访问它们。
当你执行
import pygame
pygame 已完全导入并可以使用,不再需要导入。
现在的问题是关于这一行:
from pygame.locals import *
应该使用它有几个原因,还有一些不这样做的原因。
foo.bar.baz.ClassName.classmethod()
的内容时,名称空间中将进行 4 次查找,这会花费一些时间。代码中这样的行越多,不必要的时间浪费就越多。from struct import *
您不能将函数命名为pack
. 因此,在使用此类导入之前,您应该探索该模块。它包含什么?它自己导入什么?from foo import *
andfrom 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
,但解释器直接知道它的地址,不会进行额外的查找。
import pygame
from pygame.locals import *
http://www.pygame.org/docs/tut/ImportInit.html
这里的第一行是唯一必要的。它将所有可用的 pygame 模块导入到 pygame 包中。第二行是可选的,将一组有限的常量和函数放入脚本的全局命名空间中。
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
>>>
我不会担心的。我知道你可能被告知*
进口产品不好。这在某种程度上是正确的,除非 Pygame 开发人员专门定义了__all__
属性,他们将所有这些方便的常量放入其中,并且他们拥有。因此,他们通过这种方式使这个特定的*
进口变得安全。
与属性相关,因此请在源代码中搜索属性中*
包含的所有常量。__all__
pygame.locals
__all__