LINUX.ORG.RU

Как в Python достучаться до глобального объекта из другого модуля

 , доступ к переменным, ,


0

1

В основном модуле Python-программы у меня создается объект:

from Log import *

log=Log()

В этом же основном модуле объект доступен отовсюду:

log.echo("Ping test: "+p1)
...
sendMail('Monitoring data', log.getAll())

Однако в других модулях, которые подключены к основному модулю через директиву типа:

from MeasureValue import *

объект log недоступен.

Вопрос: как достучаться до объекта, созданного в основном модуле, из других модулей?

★★★★★

А зачем вываливать всё содержимое модуля в основное пространство имён? Так ведь бардак плодится.

MrClon ★★★★★
()
Ответ на: комментарий от MrClon

Мне не нужно вываливать все содержимое модуля. Мне нужно понять, как в основном модуле создать объект (по сути, это Singleton), который будет доступен везде в программе.

Таких объектов немного - обычно это объект логирования да объект конфигурации программы.

Я просто в Python новичек, пока что не понимаю как управляться с областями видимости. Вот здесь что-то похожее написано:

http://pep8.ru/doc/tutorial-3.1/9.html

но мне нужен конкретный пример именно по моему вопросу.

Xintrea ★★★★★
() автор топика

Не понял, а что мешает делать log=Log() не в основном модуле, а в модуле Log, который импортируется?

l0k9j8
()

никак, ты должен явно его в эти модули импортировать.
создай отдельный файл где создаётся экземпляр логгера и импортируй его во все модули

Aeon
()
from Log import *
import __builtin__
__builtin__.LOG = Log() # помещаем ссылку на объект класса Log во встроенное пространство имен (где все встроенные функции и исключения находятся); когда за тобой придут из программистского ада, передашь привет ;); теперь LOG доступен в любом модуле программы
print LOG
Virtuos86 ★★★★★
()
Последнее исправление: Virtuos86 (всего исправлений: 1)

Проимпортировать основной модуль (или log из него) в другие.

anonymous
()
Ответ на: комментарий от Xintrea

1. import * — зло.

2.

Однако в других модулях, которые подключены к основному модулю через директиву типа:

from MeasureValue import *

объект log недоступен.

А log у тебя точно глобальный там?

x3al ★★★★★
()
from Log import *

Вах! Зойчем так делаишь?

yvv ★★☆
()
Ответ на: комментарий от Aeon

никак, ты должен явно его в эти модули импортировать.
создай отдельный файл где создаётся экземпляр логгера и импортируй его во все модули

Ага, сделал так.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от MrClon

Да нет, я про это «from MeasureValue import *». Зачем так импортировать?

У меня в одном модуле один класс.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Тогда тем более нет причин не импортировать его явно по имени.

x3al ★★★★★
()
Ответ на: комментарий от stevejobs

От import * в питоне страдает производительность не программы, а программиста.

PolarFox ★★★★★
()

Я в аналогичной ситуации сделал сингтон так -

  1. В модуле «Log» объявил класс со статическими полями. При первом создании экземпляра - инициализирую поля - открываю файл для печати логов. В классе есть методы для вывода логов, типа «print»
  2. В этом же модуле создаю экземпляр, типа как у тебя log=Log()
  3. В этом же модуле дефайню интерфейсные методы, которые делают вызовы log.print()
  4. Через список __all__ разрешаю доступ только к интерфейсным методам.

Теперь могу делать «import Log» сколько угодно раз и печатать через доступные методы

MadMax
()
Ответ на: комментарий от Boba_Fett

В данном контексте это вполне нормальный термин, я щитаю :)

boombick ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.