Alguém pode, por favor, explicar esta estranha convenção de importação de Pygame?

Eu vejo que as pessoas geralmente importam Pygame assim:

<code>import pygame
from pygame.locals import *
</code>

Eu não entendo o que é a segunda linha. Se já importamos o Pygame inteiro, por que importarpygame.locals? O Pygame já não o inclui uma vez que é importado?

questionAnswers(6)

Quando você executa

<code>import pygame
</code>

o pygame é totalmente importado e pronto para funcionar, não são necessárias mais importações.

Agora a questão é sobre esta linha:

<code>from pygame.locals import *
</code>

Existem várias razões pelas quais isso deve ser usado, e algumas razões para não fazê-lo.

Atuação. Quando você digita algo comofoo.bar.baz.ClassName.classmethod(), haverá quatro pesquisas no namespace, que custam algum tempo. Quanto mais linhas no código, mais desnecessário desperdício de tempo.Simplicidade. Quando você escreve tutoriais, tenta explicar as coisas da maneira mais simples possível. Então, quanto menos código, melhor o tutorial.Facilidade. Quando você digita seu código, você o espalha em arquivos diferentes. Porque é mais fácil trabalhar com arquivos secundários menores e, em seguida, importar todos eles no principal. Mas você entende completamente o que você está importando.Poluição por namespase. Quando você importa tudo, de módulo para globais, fica mais limitado na escolha de variáveis ​​globais. Por exemplo,from struct import * você não pode nomear sua função comopack. Portanto, antes de usar essas importações, você deve explorar o módulo. O que contém? O que importa por si só?Bagunça. Quando você usa essas importações muitas vezes,from foo import * efrom bar import * efrom baz import *, algumas variáveis ​​ou constantes podem ser sombreadas ou sobrescritas. Neste exemplo,foo.version é sobrescrito combar.version, agora nomeado comoversion. Assim,foo.checkversion() não funcionará mais corretamente.

A maneira correta é importar as funções comumente usadas de forma explícita, ou torná-las uma referência rápida, especialmente quando você não conhece bem o módulo.

Por exemplo:

<code>from foo.bar.baz import a_very_useful_function
</code>

ou

<code>import foo.bar.baz
quick_referenced_fn = foo.bar.baz.a_very_useful_function
</code>

Aquiquick_referenced_fn está paradofoo.bar.baz.a_very_useful_function e funciona no namespace defoo.bar.baz, mas o intérprete sabe seu endereço diretamente e não fará pesquisas adicionais.

<code>import pygame
from pygame.locals import *
</code>

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

A primeira linha aqui é a única necessária. Ele importa todos os módulos pygame disponíveis no pacote pygame. A segunda linha é opcional e coloca um conjunto limitado de constantes e funções no namespace global do seu script.

Eu não me preocuparia com isso. Eu sei que você pode ter sido dito que* as importações são ruins. Isso é verdade até certo ponto, a menos que os desenvolvedores do Pygame definissem__all__ atributo, no qual eles colocaram todas essas constantes úteis, e elas têm. Então, dessa forma eles fizeram isso em particular* importação segura.

o* relaciona-se com o__all__ atributo, então pesquisepygame.locals código-fonte para todas as constantes incluídas no__all__ atributo.

O Pygame já não o inclui uma vez que é importado?

Não. Não necessariamente.

<code>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
>>> 
</code>

Na verdade, do pygamedocs:

Este módulo contém várias constantes usadas pelo Pygame. Seu conteúdo é colocado automaticamente no namespace do módulo pygame. No entanto, um aplicativo pode usar pygame.locals para incluir apenas as constantes Pygame com 'from pygame.locals import *'.

Então, todas essas constantes já estão lá quando você usaimport pygame. Podemos ver isso se fizermos isso:

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

Assim,pygame.locals é um subconjunto deimport pygame.. Então não adianta fazer isso se você já importou pygame! Além disso, permite que você os acesse sem opygame prefixo.

 Stefano Borini26 de abr de 2012 17:14
@Bane: não é redundante. Você está deixando extremamente claro o que entra no seu namespace e como.
 corazza26 de abr de 2012 17:11
Isso parece um pouco redundante.
 David Robinson26 de abr de 2012 17:14
pygame.locals é chamado de locais, porque é preenchido com funções que você chama com freqüência. Adicionandopygame.locals. cada vez tornaria o código menos compacto.
QuestionSolution
<code>import pygame
</code>

importa o módulo pygame para o namespace "pygame".

<code>from pygame.locals import *
</code>

copia todos os nomes em pygame.locals para o seu namespace atual. Isso não é necessário, mas evita que você digite.

yourAnswerToTheQuestion