Странный способ передачи данных между модулями в Python: как это работает?


Я должен работать с каким-то беспорядочным кодом, который я не написал сам, и среди этого беспорядка я обнаружил два сценария, которые общаются таким странным образом (через 3-й сценарий посредника):

message.py, сценарий "посредника":

class m():
    pass

sender.py, Кто хочет отправить некоторую информацию получателю:

from message import m

someCalculationResult = 1 + 2
m.result = someCalculationResult

receiver.py, Кто хочет напечатать некоторые результаты, полученные с помощью sender.py:

from message import m

mInstance = m()
print mInstance.result

И, по волшебству, в интерпретаторе, импортируя sender.py, то receiver.py действительно печатает 3...

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

Использование Python 2.6.6

1 3

1 ответ:

Это просто запутанный способ установить глобальный.

m является классом, m.result атрибутом класса. И отправитель, и получатель могут получить к нему прямой доступ, так же как они могут получить доступ к m.

Они могли бы сделать и это:

# sender
import message
message.result = someCalculationResult

# receiver
import message
print message.result

Здесь result-это просто имя в модуле верхнего уровня message.

Следует отметить, что вы выполняете не запуск отдельных скриптов; вы импортируете модули в один и тот же интерпретатор. Если вы побежали python sender.py во-первых, без импорта reciever.py, а затем отдельно запуск python receiver.py без импорта sender.py вся эта схема не работает. Существует множество способов передачи данных из одного раздела кода в другой, слишком много, чтобы назвать их здесь, и все они подходят для другого сценария и потребности. Например, потоковая передача, отдельные процессы, отдельные компьютерывводят различные ограничения на то, как передача сообщений может и должна происходить.