2011-01-16 3 views
0

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

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

one.py

def version(): 
    print pygame.version 

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

main.py

import pygame 
import one 

pygame.init() 

one.version() 

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

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

Спасибо!

ответ

3

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

+0

Я подумал об этом; но эффективна ли она? Если я поеду по этому маршруту, мне придется импортировать Pygame в каждом модуле по мере необходимости. Возможно, если бы я создал отдельный модуль, который имеет функцию, которая импортирует Pygame при вызове? – user577317

+0

@ user577317: Да, это эффективно. Создание отдельного модуля бессмысленно, потому что вместо этого вам придется импортировать это. –

+1

@ user577317: Вы не можете манипулировать пространством имен вызывающего абонента (ну, может быть, вы можете, но это будет ненадежный взлом, возьмите значительную работу и на самом деле это плохая идея). ** Просто имейте их **, ради бога. Этот вопрос является еще одним примером того, почему оптимизация без понимания бессмысленна и вредна;) Импорт модуля, который уже был импортирован (в текущем запущенном процессе интерпретатора - вы, как правило, только один для одной программы, конечно) просто дает вам ссылку на уже импортированный модуль. То есть нет неэффективности. – delnan

1

модель импорта 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 в ваших исходных файлах модуля. Похоже, что более компактная модель импорта (там, где вы должны импортировать один и тот же модуль только один раз) будет лучше, но это имеет очень важный недостаток: компактная модель импорта будет использовать глобальное пространство имен, и это приведет к отслеживанию зависимостей (например, кому нужен этот код ?, откуда этот код появился?) намного сложнее. Поэтому каждый раз, когда вы пишете строку импорта, которая, по вашему мнению, не нужна, помните, что это (небольшая) цена, которую вы платите за поддерживаемый код.

+0

Хм ... интересный. Спасибо за совет, я буду помнить об этом. – user577317

 Смежные вопросы

  • Нет связанных вопросов^_^