Вопрос по python – Может кто-нибудь объяснить это странное соглашение об импорте Pygame?

6

Я вижу, что люди обычно импортируют Pygame следующим образом:

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

Я не понимаю, для чего вторая строка. Если мы уже импортировали всю Pygame, зачем импортироватьpygame.locals? Pygame уже не включает его, как только он импортирован?

Ваш Ответ

6   ответов
2

Когда вы выполняете

import pygame

Pygame полностью импортирован и готов к работе, импорт больше не требуется.

Теперь вопрос об этой строке:

from pygame.locals import *

Есть несколько причин, почему это следует использовать, и несколько причин, чтобы этого не делать.

  1. Performance. When you type something like foo.bar.baz.ClassName.classmethod(), there will be 4 lookups in the namespace, which cost some time. The more such lines in code, the more unnecessary waste of time.
  2. Simplicity. When you write tutorials, you try to explain things as simple as it possible. So the less code, the better tutorial.
  3. Ease. When you type your code, you spread it to different files. Because it is easier to work with smaller side-files, and then import all of them in the main. But you completely understand what you are importing.
  4. Namespase pollution. When you import everything from module into globals, you are more limited in the choice of global variables. For example, from struct import * you can't name your function as pack. So, before use such imports, you should explore the module. What does it contain? What does it import by itself?
  5. Mess. When you use such imports many times, from foo import * and from bar import * and from baz import *, some variables or constants may be shaded or overwritten. In this example, foo.version is overwritten with bar.version, now named as version. So, foo.checkversion() will not work correctly anymore.

Правильный способ - импортировать часто используемые функции в явном виде или быстро на них ссылаться, особенно если вы плохо знаете модуль.

Например:

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, но интерпретатор знает его адрес напрямую и не будет производить дополнительный поиск.

1
import pygame
from pygame.locals import *

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

Первая строка здесь является единственной необходимой. Он импортирует все доступные модули pygame в пакет pygame. Вторая строка необязательна и помещает ограниченный набор констант и функций в глобальное пространство имен вашего скрипта.

5

Собственно, из пигамовдокументы:

This module contains various constants used by Pygame. It's contents are automatically placed in the pygame module namespace. However, an application can use pygame.locals to include only the Pygame constants with a 'from pygame.locals import *'.

Таким образом, все эти константы уже есть, когда вы используетеimport pygame, Мы можем увидеть это, если мы сделаем это:

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

Так,pygame.locals это подмножествоimport pygame.. Так что абсолютно бессмысленно делать это, если вы уже импортировали Pygame! Помимо этого позволяет вам получить доступ к ним безpygame префикс.

@Bane: это не избыточно. Вы четко объясняете, что входит в ваше пространство имен и как.
pygame.locals называется localals, потому что он заполнен функциями, которые вы часто вызываете. Добавлениеpygame.locals. каждый раз делает код менее компактным.
Это кажется немного излишним. corazza
1

Doesn't Pygame already include it once it's imported?

Нету. Не обязательно.

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
>>> 
6
import pygame

импортирует модуль pygame в «pygame» Пространство имен.

from pygame.locals import *

копирует все имена в pygame.locals в ваше текущее пространство имен. Это не обязательно, но спасает вас от набора текста.

0

Я бы не беспокоился об этом. Я знаю, что вам, возможно, сказали, что* импорт плохой. Это в некоторой степени верно, если разработчики Pygame не определили__all__ атрибут, в который они помещают все эти удобные константы, и они имеют. Таким образом, таким образом они сделали этот конкретный* импортный сейф.

* относится к__all__ атрибут, поэтому ищитеpygame.locals исходный код для всех констант, включенных в__all__ приписывать.

Похожие вопросы