有人可以解释这个奇怪的pygame的进口惯例?(Can someone please explain

2019-06-24 00:21发布

我看到,人们通常导入pygame的是这样的:

import pygame
from pygame.locals import *

我不明白什么是第二线。 如果我们已经导入了整个pygame的,为什么进口pygame.locals ? 不pygame的已经包括了它,一旦它的进口?

Answer 1:

import pygame

进口pygame的模块进入“pygame的”命名空间。

from pygame.locals import *

copys在pygame.locals所有名称到当前的命名空间。 这时并不需要,但可以节省你打字。



Answer 2:

其实,从pygame的文档 :

该模块包含Pygame中使用的各种常量。 它的内容会被自动放入Pygame的模块命名空间。 但是,应用程序可以使用pygame.locals只包括Pygame的常量以“从pygame.locals导入*”。

因此,所有这些常数已经在那里当您使用import pygame 。 我们可以看到这一点,如果我们这样做:

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

所以, pygame.locals的一个子集import pygame ..所以,绝对没有一点做,如果你已经导入pygame的! 除了它允许您访问他们没有pygame前缀。



Answer 3:

当您执行

import pygame

Pygame的完全进口和准备工作,不需要更多的进口。

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

from pygame.locals import *

有几个原因,这应该使用,有几个理由不这样做。

  1. 性能。 当你输入像foo.bar.baz.ClassName.classmethod()会出现在命名空间,其成本一定时间4个查找。 越这样的线在代码中,时间更不必要的浪费。
  2. 简单。 当你写的教程,你试图解释的东西简单,因为它可能。 所以更少的代码,更好的教程。
  3. 缓解。 当你输入你的代码,你把它传播到不同的文件。 因为它更容易与较小侧的文件工作,然后导入所有的人为主。 但你完全理解要导入的。
  4. Namespase污染。 当您从模块导入到一切全局,你是在全局变量的选择较为有限。 例如, from struct import *您不能命名功能pack 。 所以,在使用这种进口的,你应该探索模块。 里面是什么东西? 这是什么本身导入?
  5. 混乱。 当您使用此类进口很多次, 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 ,但解释直接知道它的地址,不会进行其他查询。



Answer 4:

import pygame
from pygame.locals import *

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

这里的第一行是只需要一个。 它导入所有可用的pygame的模块到pygame的包。 第二行是可选的,并提出了一套有限的常量和功能为脚本的全局命名空间。



Answer 5:

不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
>>> 


Answer 6:

我不会担心。 我知道你可能已被告知, *进口是坏的。 这才是真正的在一定程度上,除非pygame的开发商特别定义__all__属性,在他们已经把所有这些方便,花花公子常量,他们有。 所以,这样他们提出这个特殊的*进口安全。

*涉及__all__属性,因此搜索pygame.locals源代码包含在所有常量__all__属性。



文章来源: Can someone please explain this weird Pygame importing convention?