python: доступность (видимость) переменной из всех модулей

Модератор: Модераторы разделов

Аватара пользователя
nadge
Сообщения: 1519
ОС: ArchLinux, Ubuntu 10.10

python: доступность (видимость) переменной из всех модулей

Сообщение nadge »

Есть переменная - объект класса. Нужно чтобы ее было видно из всех модулей (создается она в главном). (В том числе из объектов других классов, если это имеет значение.)

Можно такое сделать? Если да, то как?



З.Ы. Туплю наверно... но никак не соображу...

З.З.Ы. Питон 2.6, но могу поставить 2.7, если вдруг это там появилось.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: python: доступность (видимость) переменной из всех модулей

Сообщение watashiwa_daredeska »

Положить её в модуль и импортировать этот модуль везде, где надо.

nadge писал(а):
31.08.2010 10:22
могу поставить 2.7, если вдруг это там появилось.
Скорее уж исчезло бы. Глобальные переменные -- ужасное зло, об этом известно очень давно.
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: python: доступность (видимость) переменной из всех модулей

Сообщение Portnov »

Если очень хочется, можно извратиться следующим образом:

Код: Выделить всё

import os
import ...
import ...

GLOBALVAR=...

module = type(os)

for value in globals().itervalues():
  if type(value) == module:
    setattr(value, "GLOBALVAR", GLOBALVAR)
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: python: доступность (видимость) переменной из всех модулей

Сообщение watashiwa_daredeska »

Portnov писал(а):
31.08.2010 11:07
Если очень хочется, можно извратиться следующим образом:
Ужас какой :)

Код: Выделить всё

__builtins__.GLOBALVAR = GLOBALVAR
:)
Спасибо сказали:
Аватара пользователя
nadge
Сообщения: 1519
ОС: ArchLinux, Ubuntu 10.10

Re: python: доступность (видимость) переменной из всех модулей

Сообщение nadge »

Положить её в модуль и импортировать этот модуль везде, где надо.

С этого и начал, но проблема в том, что иногда значение этой переменной должно меняться... а просто поменять ее не получается - в других модулях вроде как видна старая (или я не так что-то сделал?). В итоге написал отдельную тривиальную функцию внутри этого модуля для смены значения переменной... Вроде заработало.

Если очень хочется, можно извратиться следующим образом:

Любопытно, попробую.

Скорее уж исчезло бы. Глобальные переменные -- ужасное зло, об этом известно очень давно.

Согласен с Вами, но в моем случае это нужно, в основном, для отладки - в релизе можно будет закомментить. Просто специфика такая...

Если вкратце, то часть проекта функционирует как виндовый сервис, да еще и по сети (т.е. обычным отладчиком проблематично отлаживать)... В итоге из всех модулей из каждого класса и отдельных функций посылается куча отладочных сообщений по джабберу (есть лучше варианты?). И чтобы не создавать путаницу в коде я и решил использовать глобальную переменную.


З.Ы. За ответы спасибо. Вроде все заработало, но надо еще потестировать...
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: python: доступность (видимость) переменной из всех модулей

Сообщение watashiwa_daredeska »

nadge писал(а):
01.09.2010 02:11
или я не так что-то сделал?
Видимо, не так. Всё должно нормально меняться. Только импортировать надо не "from module import var", а просто "import module" и обращаться к переменной "module.var", тогда всё будет в порядке.

Код: Выделить всё

# m1.py
a = 1

Код: Выделить всё

# m2.py
import m1
def getA():
  return m1.a
def setA(value):
  m1.a = value

Код: Выделить всё

# m3.py
from m1 import a
def getA():
  return a

Код: Выделить всё

# p1.py
import m1, m2, m3

print m1.a, m2.getA(), m3.getA()
m1.a = 2
print m1.a, m2.getA(), m3.getA()
m2.setA(3)
print m1.a, m2.getA(), m3.getA()

user@localhost

$ python p1.py 1 1 1 2 2 1 3 3 1 $

Как видно, m3.py работает не так, как хотелось. При присваивании тем более.

nadge писал(а):
01.09.2010 02:11
В итоге из всех модулей из каждого класса и отдельных функций посылается куча отладочных сообщений по джабберу (есть лучше варианты?). И чтобы не создавать путаницу в коде я и решил использовать глобальную переменную.
Модуль logging.
Спасибо сказали:
Аватара пользователя
nadge
Сообщения: 1519
ОС: ArchLinux, Ubuntu 10.10

Re: python: доступность (видимость) переменной из всех модулей

Сообщение nadge »

watashiwa_darede...
В приведенный код сейчас не въеду, но утром посмотрю - спасибо.

Модуль logging.

Если я правильно понял Вашу идею (через этот модуль посредством моей функции слать на тот же джаббер), то вариант вроде хороший. Попробую, спасибо.


Спасибо сказали:
Аватара пользователя
nadge
Сообщения: 1519
ОС: ArchLinux, Ubuntu 10.10

Re: python: доступность (видимость) переменной из всех модулей

Сообщение nadge »

watashiwa_darede... писал(а):
01.09.2010 02:34
Модуль logging.

Воспользовался, написав соответствующий handler. Все работает и очень удобно. Еще раз спасибо за идею.
Спасибо сказали: