2012-04-26 1 views

risposta

6
import pygame 

importa il modulo pygame nel namespace "pygame".

from pygame.locals import * 

copys tutti i nomi in pygame.locals nel tuo spazio dei nomi corrente. Questo non è necessario, ma ti risparmia la digitazione.

5

realtà dal Pygame docs:

Questo modulo contiene varie costanti usate da Pygame. I contenuti sono automaticamente posizionati nello spazio dei nomi del modulo pygame. Tuttavia, un'applicazione può utilizzare pygame.locals per includere solo le costanti di Pygame con un 'da pygame.locals import *'.

Quindi tutte queste costanti sono già presenti quando si utilizza import pygame. Possiamo vedere questo se facciamo questo:

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

Quindi, pygame.locals è un sottoinsieme di import pygame .. Quindi assolutamente nessun punto di farlo, se è già stato importato pygame! Oltre a ciò consente di accedervi senza il prefisso pygame.

+0

Sembra un po 'ridondante. – corazza

+2

@Bane: non è ridondante. Stai rendendo estremamente chiaro ciò che entra nel tuo spazio dei nomi, e come. –

+4

'pygame.locals' è chiamato gente del posto perché è pieno di funzioni chiamate frequentemente. L'aggiunta di 'pygame.locals' ogni volta renderebbe il codice meno compatto. –

1
import pygame 
from pygame.locals import * 

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

La prima riga qui è l'unica necessaria. Importa tutti i moduli pygame disponibili nel pacchetto pygame. La seconda riga è facoltativa e inserisce un insieme limitato di costanti e funzioni nello spazio dei nomi globale del tuo script.

1

non Vuol Pygame includono già una volta che è importata?

No. Non necessariamente.

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

Quando si esegue

import pygame 

il pygame è completamente importato e pronti a lavorare, non sono necessarie maggiori importazioni.

Ora la domanda è su questa linea:

from pygame.locals import * 

Ci sono diversi motivi per cui questo dovrebbe essere usato, e un paio di ragioni per non farlo.

  1. Prestazioni. Quando si digita qualcosa come foo.bar.baz.ClassName.classmethod(), ci saranno 4 ricerche nello spazio dei nomi, che costano un po 'di tempo. Più linee di questo tipo nel codice, più inutili perdite di tempo.
  2. Semplicità. Quando si scrivono tutorial, si tenta di spiegare le cose il più semplice possibile. Quindi meno codice, il tutorial migliore.
  3. Facilità. Quando si digita il codice, lo si diffonde in file diversi. Perché è più facile lavorare con file laterali più piccoli e quindi importarli tutti nel main. Ma capisci completamente cosa stai importando.
  4. Inquinamento di Namespase. Quando si importa tutto dal modulo in globals, si è più limitati nella scelta delle variabili globali. Ad esempio, from struct import * non è possibile assegnare un nome alla funzione come pack. Quindi, prima di utilizzare tali importazioni, dovresti esplorare il modulo. Cosa contiene? Cosa importa da solo?
  5. Mess. Quando si utilizzano tali importazioni molte volte, from foo import * e from bar import * e from baz import *, alcune variabili o costanti possono essere ombreggiate o sovrascritte. In questo esempio, foo.version viene sovrascritto con bar.version, ora denominato come version. Quindi, foo.checkversion() non funzionerà più correttamente.

Il modo corretto consiste nell'importare le funzioni comunemente utilizzate in forma esplicita o renderle un riferimento rapido, soprattutto quando non si conosce bene il modulo.

Ad esempio:

from foo.bar.baz import a_very_useful_function 

o

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

Qui quick_referenced_fn è ancora foo.bar.baz.a_very_useful_function e lavora nello spazio dei nomi di foo.bar.baz, ma interprete sa il suo indirizzo direttamente e non farà le ricerche ulteriori.

0

Non me ne preoccuperei. So che forse ti è stato detto che le importazioni di * non sono buone. Questo è vero fino a un certo punto, a meno che gli sviluppatori di Pygame non specificatamente definiscano l'attributo __all__, nel quale hanno messo tutte quelle costanti dandy maneggevoli, e hanno. Quindi, in questo modo hanno reso sicura l'importazione di questo particolare *.

La * riferisce all'attributo __all__, quindi ricercare il codice sorgente pygame.locals per tutte le costanti incluse nell'attributo __all__.