Pytanie w sprawie python, import, pygame – Czy ktoś może wyjaśnić tę dziwną konwencję importowania Pygame?

6

Widzę, że ludzie zazwyczaj importują Pygame w ten sposób:

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

Nie rozumiem, po co jest druga linia. Jeśli już zaimportowaliśmy cały Pygame, po co importowaćpygame.locals? Czy Pygame nie zawiera go już po zaimportowaniu?

Twoja odpowiedź

6   odpowiedzi
6
<code>import pygame
</code>

importuje moduł pygame do przestrzeni nazw „pygame”.

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

kopiuje wszystkie nazwy w pygame.locals do bieżącej przestrzeni nazw. Nie jest to konieczne, ale oszczędza pisania.

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

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

Pierwsza linia jest tutaj jedyna niezbędna. Importuje wszystkie dostępne moduły pygame do pakietu pygame. Druga linia jest opcjonalna i wprowadza ograniczony zestaw stałych i funkcji do globalnej przestrzeni nazw skryptu.

1

Czy Pygame nie zawiera go już po zaimportowaniu?

Nie. Niekoniecznie.

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

Właściwie z pygamedocs:

Moduł ten zawiera różne stałe używane przez Pygame. Jego zawartość jest automatycznie umieszczana w przestrzeni nazw modułu pygame. Aplikacja może jednak użyć pygame.locals, aby uwzględnić tylko stałe Pygame z importem „from pygame.locals *”.

Więc wszystkie te stałe są już obecne podczas używaniaimport pygame. Możemy to zobaczyć, jeśli to zrobimy:

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

Więc,pygame.locals jest podzbioremimport pygame.. Więc absolutnie nie ma sensu robić tego, jeśli już zaimportowałeś pygame! Oprócz tego pozwala na dostęp do nich bezpygame prefiks.

To wydaje się trochę zbędne. corazza
@Bane: nie jest zbędny. Wyraźnie wyjaśniasz, co dostajesz w swojej przestrzeni nazw i jak. Stefano Borini
pygame.locals nazywany jest lokalnymi, ponieważ jest wypełniony często wywoływanymi funkcjami. Dodawaniepygame.locals. za każdym razem kod byłby mniej zwarty. David Robinson
0

Nie martwię się o to. Wiem, że ci to powiedziano* import jest zły. Dotyczy to w pewnym stopniu, chyba że programiści Pygame wyraźnie zdefiniowali__all__ atrybut, w którym umieścili wszystkie te poręczne dandy, i mają. W ten sposób stworzyli ten konkret* importuj bezpiecznie.

The* odnosi się do__all__ atrybut, więc wyszukajpygame.locals kod źródłowy dla wszystkich stałych zawartych w__all__ atrybut.

2

Kiedy wykonujesz

<code>import pygame
</code>

pygame jest w pełni importowany i gotowy do pracy, nie jest już potrzebny import.

Teraz pytanie dotyczy tej linii:

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

Jest kilka powodów, dla których należy to wykorzystać, i kilka powodów, aby tego nie robić.

Wydajność. Kiedy wpiszesz coś takiegofoo.bar.baz.ClassName.classmethod(), w przestrzeni nazw będą 4 wyszukiwania, które kosztują trochę czasu. Im więcej takich linii w kodzie, tym bardziej niepotrzebna strata czasu.Prostota. Kiedy piszesz tutoriale, próbujesz wyjaśnić rzeczy tak prosto, jak to możliwe. Im mniej kodu, tym lepszy samouczek.Łatwość. Po wpisaniu kodu rozpowszechniasz go na różne pliki. Ponieważ łatwiej jest pracować z mniejszymi plikami bocznymi, a następnie zaimportować je wszystkie. Ale całkowicie rozumiesz, co importujesz.Zanieczyszczenie nazwami. Kiedy importujesz wszystko z modułu do globalnych, jesteś bardziej ograniczony w wyborze zmiennych globalnych. Na przykład,from struct import * nie możesz nazwać swojej funkcji jakopack. Zanim więc użyjesz takiego importu, powinieneś zbadać moduł. Co zawiera? Co sam importuje?Bałagan. Kiedy używasz takiego importu wiele razy,from foo import * ifrom bar import * ifrom baz import *, niektóre zmienne lub stałe mogą być cieniowane lub nadpisywane. W tym przykładziefoo.version jest nadpisywanybar.version, teraz nazwany jakoversion. Więc,foo.checkversion() nie będzie już działać poprawnie.

Właściwym sposobem jest zaimportowanie powszechnie używanych funkcji w jawnej formie lub uczynienie ich szybkim odniesieniem, zwłaszcza gdy nie znasz dobrze modułu.

Na przykład:

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

lub

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

Tutajquick_referenced_fn jest wciążfoo.bar.baz.a_very_useful_function i działa w przestrzeni nazwfoo.bar.baz, ale tłumacz zna swój adres bezpośrednio i nie dokona dodatkowych wyszukiwań.

Powiązane pytania