7

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

import pygame
from pygame.locals import *

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

4

6 回答 6

8
import pygame

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

from pygame.locals import *

将 pygame.locals 中的所有名称复制到您当前的命名空间中。这不是必需的,但可以节省您的打字时间。

于 2012-04-26T15:12:14.220 回答
6

实际上,来自 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.localsimport pygame.. 的一个子集,所以如果你已经导入了 pygame,那么绝对没有意义!pygame除此之外,您还可以在没有前缀的情况下访问它们。

于 2012-04-26T15:10:34.563 回答
3

当你执行

import pygame

pygame 已完全导入并可以使用,不再需要导入。

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

from pygame.locals import *

应该使用它有几个原因,还有一些不这样做的原因。

  1. 表现。当您键入类似foo.bar.baz.ClassName.classmethod()的内容时,名称空间中将进行 4 次查找,这会花费一些时间。代码中这样的行越多,不必要的时间浪费就越多。
  2. 简单。当您编写教程时,您会尝试尽可能简单地解释事物。所以代码越少,教程就越好。
  3. 舒适。当您键入代码时,您会将其分散到不同的文件中。因为使用较小的边文件更容易,然后将它们全部导入主文件。但是您完全了解您要导入的内容。
  4. 命名空间污染。当您将模块中的所有内容导入全局变量时,您在全局变量的选择上会受到更多限制。例如,from struct import *您不能将函数命名为pack. 因此,在使用此类导入之前,您应该探索该模块。它包含什么?它自己导入什么?
  5. 混乱。当您多次使用此类导入时,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,但解释器直接知道它的地址,不会进行额外的查找。

于 2012-04-26T23:30:07.867 回答
2
import pygame
from pygame.locals import *

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

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

于 2012-04-26T15:11:31.570 回答
2

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
>>> 
于 2012-04-26T15:12:38.477 回答
0

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

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

于 2017-10-13T19:57:09.430 回答