2012-04-26 13 views

Respuesta

6
import pygame 

importa el módulo pygame en el espacio de nombres "pygame".

from pygame.locals import * 

copys todos los nombres en pygame.locals en su espacio de nombre actual. Esto no es necesario, pero te ahorra tipear.

5

En realidad, desde el pygame docs:

Este módulo contiene diversas constantes utilizadas por Pygame. Sus contenidos se colocan automáticamente en el espacio de nombres del módulo de pygame. Sin embargo, una aplicación puede usar pygame.locals para incluir solo las constantes Pygame con una importación 'from pygame.locals *'.

De modo que todas estas constantes ya están allí cuando usa import pygame. Podemos ver esto si hacemos esto:

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

Así, pygame.locals es un subconjunto de import pygame .. Por lo tanto absolutamente ningún punto de hacerlo si ya ha importado pygame! Además, le permite acceder a ellos sin el prefijo pygame.

+0

Eso parece un poco redundante. – corazza

+2

@Bane: no es redundante. Está dejando muy claro lo que se pone en su espacio de nombres, y cómo. –

+4

'pygame.locals' se llama locals porque está lleno de funciones que llama con frecuencia. Agregar 'pygame.locals' cada vez haría que el código fuera menos compacto. –

1
import pygame 
from pygame.locals import * 

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

La primera línea aquí es el único necesario. Importa todos los módulos de pygame disponibles en el paquete de pygame. La segunda línea es opcional y pone un conjunto limitado de constantes y funciones en el espacio de nombres global de su secuencia de comandos.

1

¿No incluye Pygame una vez que se importa?

Nope. No necesariamente.

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

Al ejecutar

import pygame 

la pygame está totalmente importado y listo para trabajar, no se necesitan más importaciones.

Ahora la pregunta es sobre esta línea:

from pygame.locals import * 

Hay varias razones por las cuales esto se debe utilizar, y algunas de las razones para no hacerlo.

  1. Rendimiento. Cuando escribe algo como foo.bar.baz.ClassName.classmethod(), habrá 4 búsquedas en el espacio de nombres, que le costará algo de tiempo. Cuantas más líneas en el código, más pérdida de tiempo innecesaria.
  2. Simplicidad. Cuando escribe tutoriales, intenta explicar las cosas de la manera más simple posible. Por lo tanto, cuanto menos código, mejor tutorial.
  3. Facilidad. Cuando escribe su código, lo extiende a diferentes archivos. Porque es más fácil trabajar con archivos secundarios más pequeños, y luego importarlos todos en el principal. Pero usted comprende completamente lo que está importando.
  4. Contaminación de paquetes de nombres. Cuando importa todo, desde el módulo a los globales, está más limitado en la elección de las variables globales. Por ejemplo, from struct import *, no puede nombrar su función como pack. Entonces, antes de usar tales importaciones, debe explorar el módulo. ¿Qué contiene? ¿Qué importa por sí mismo?
  5. Mess. Cuando utiliza tales importaciones muchas veces, from foo import * y from bar import * y from baz import *, algunas variables o constantes pueden sombrearse o sobrescribirse. En este ejemplo, foo.version se sobrescribe con bar.version, ahora denominado version. Entonces, foo.checkversion() ya no funcionará correctamente.

La forma correcta es importar las funciones comúnmente usadas en forma explícita, o hacerlas una referencia rápida, especialmente cuando no se conoce bien el módulo.

Por ejemplo:

from foo.bar.baz import a_very_useful_function 

o

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

Aquí quick_referenced_fn sigue siendo foo.bar.baz.a_very_useful_function y trabaja en el espacio de nombres de foo.bar.baz, pero intérprete conoce su dirección directamente y no realizar búsquedas adicionales.

0

No me preocuparía. Sé que es posible que le hayan informado que las importaciones de * son malas. Eso es cierto hasta cierto punto, a menos que los desarrolladores de Pygame definan específicamente el atributo __all__, en el cual han puesto todas esas constantes hand-dandy, y lo han hecho. Entonces, de esa manera hicieron que esta importación particular de * fuera segura.

El * se relaciona con el atributo __all__, por lo que buscar el código fuente para pygame.locals todas las constantes incluidas en el atributo __all__.

Cuestiones relacionadas