Использование модуля Pygame из импортированного скрипта - PullRequest
0 голосов
/ 16 января 2011

Привет!Я создаю простую игру со змеями.Я хочу расширить свои классы в разных модулях, у меня есть класс меню в отдельном сценарии от моего основного цикла игры.Другими словами, я хочу, чтобы мой импортированный скрипт использовал инициацию pygame, которая была вызвана ранее в основном скрипте.

Вот краткий пример использования псевдокода моей проблемы:

one.py

def version():
    print pygame.version

В main.py я импортировал pygame и сделал pygame.init ().Отсюда я также хочу использовать def version () из one.py

main.py

import pygame
import one

pygame.init()

one.version()

Однако, это дает мне ошибку, определенную без pygame.Я знаю причину, по которой он выдает ошибку, потому что когда one.py вызывается из main.py, он не сохраняет объявления из main.py.

Я хочу знать, что это методчтобы сделать вышеупомянутое, что на самом деле будет работать.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 16 января 2011

Импорт модуля, который импортирует модуль X, не просачивается в пространство имен X (что хорошо - для этого потребуется либо динамическая область видимости, либо стиль C / C ++ #include, оба они почти никогда не используются и частодаже вредно).Это совершенно отдельное пространство имен само по себе.Если вы хотите использовать что-то (например, pygame) в модуле (например, one), импортируйте его туда.

1 голос
/ 16 января 2011

Модель импорта Python следующая: если вам нужен модуль a.b.c в вашем модуле d.e.f, то добавьте import a.b.c (или аналогичный) в начало d/e/f.py.(Это похоже на то, как работает импорт Java.) Поэтому, если у вас есть много модулей (например, d.e.f1, d.e.f2, ...), которым нужно много модулей (например, a.b.c1, a.b.c2, ...),затем вы должны импортировать каждый необходимый модуль из каждого из ваших модулей, в результате чего в исходных файлах вашего модуля будет несколько копий одного и того же оператора import.Похоже, что более компактная модель импорта (где вы должны импортировать один и тот же модуль только один раз) была бы лучше, но у этого есть очень важный недостаток: модель компактного импорта будет использовать глобальное пространство имен, и она будет отслеживать зависимости (например, кому нужен этот код? откуда этот код?) гораздо сложнее.Поэтому каждый раз, когда вы пишете строку импорта, которая, по вашему мнению, не нужна, помните, что это (маленькая) цена, которую вы платите за поддерживаемый код.

...