2013-12-19 2 views
0

Я импортировать один модуль из другого модуляКак импортировать только требуемые объекты в python?

первый модуль имеет

a variable initialized to None 
a method 

В другом модуле я ввожу первый модуль с использованием

from 1stmodule import method 

но инициализирует переменную снова None когда я импортирую, как я могу импортировать только метод во второй модуль без изменения переменной?

+0

Что вы имеете в виду под «инициализацией переменной ** снова ** в None»? Импортирование того же модуля во второй раз __ в том же процессе__ не будет повторно инициализировать модуль. –

ответ

1

Вам нужно будет использовать глобальное ключевое слово, например. global your_var, чтобы внести любые изменения, внесенные в него по всему миру. См. this question для более подробной информации.

Вы также должны быть чрезвычайно осторожны, как и где вы изменяете эту переменную, потому что, если вы потеряете трек, вы собираетесь тратить много времени на отладку и задаетесь вопросом, почему переменная не возвращается со значением, которое вы ожидается.

Всегда есть дискуссия о том, насколько опасны глобальные переменные, но я склонен к мнении. Если вы не уверены, следует ли использовать глобальную переменную или нет, то вы не должны использовать глобальную переменную ,

В действительности я предлагаю изменить ваш подход.

+0

Что делает заявление 'global' в отношении проблемы op? –

+0

Он пытается глобально изменить переменную в '1stmodule', которая не будет работать, поскольку это не глобальная переменная. См. [Этот аналогичный вопрос] (http://stackoverflow.com/questions/7060711/accessing-module-level-variables-from-within-a-function-in-the-module) для более глубокого объяснения. – ptr

+0

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

1

При импорте модуля Python выполнит код модуля. Вот почему вы можете выполнить скрипт, просто импортировав его. Чтобы предотвратить модуль от выполняется, добавьте:

if "__name__" == __main__: 
    # the code that should run if this file 
    # is run directly as a script, e.g. from 
    # the command line 
    main() 

Это утверждение говорит Python: Execute main(), но только если я (модуль) я не импортируется.

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

И как @brunodesthuilliers Саидов: операторы верхнего модуля уровня выполняются только на первом импорте (для данного процесса)

+0

Да, правильный ответ здесь. – Alice

+0

Я не уверен, что согласен с тем, что это проблема инициализации. Как отметил @bruno_desthilliers, модуль импортируется только один раз. Из того, что я могу собрать из ОП, он с трудом понимал, почему переменная уровня модуля, которую он изначально установил в «Нет» и (предположим), изменила значение где-то в «1stmodule», снова вернулась к None, когда он попытался получить доступ это прямо. Это не вызвано модулем «повторная инициализация» при импорте. – ptr

+0

Извините, но это не «правильный ответ». Операторы модуля верхнего уровня выполняются только при первом импорте (для данного процесса). –

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