Email or username:

Password:

Forgot your password?
Мя :sparkles_lesbian:

Что за ебаная магия

Вот есть в главном модуле глобальная переменная

rmq_connection

также, есть on_startup хук в aiogram, который подключается и присваивает ей значение

а ещё есть хендлер, который делает внутри себя import main и потом берет это значение

Так вот, в хендлере по непонятным причинам видно только старое значение, заданное до выполнения on_startup....

10 comments
Мя :sparkles_lesbian:

inb4: on_startup присваивает значение именно глобальной переменной, а не в своем скоупе

async def init(...):
global rmq_connection
...

Мя :sparkles_lesbian:

Фан факт, проблема вылечилась импортом магического модуля __main__ и затыканием ide по поводу того, что такого пакета нет в зависимостях

Оказывается, для питона это разные модули, и если импортировать main по его пути, без магии, то он его загрузит заново....

Dima

@mo
Если первый вариант был таким
from main import rmq_connection
То новые значения rmq_connection не будут видны.

import main
....
print(main.rmq_connection)
Должен видеть новое значение.

Мя :sparkles_lesbian:

@dima а хуй там, он даже так видит значение до инициализации :)

и да, оно там не меняется. Оно один раз лениво инициализируется, и уже после этого используется в нижележащих модулях
Просто для его инициализации нужен IO, а используется оно одно на всю программу (потому что установка соединения это относительно затратно, и поэтому в RabbitMQ есть свой уровень мультиплексирования — каналы)

Dima

@mo интересно, но не понятно, почему он видит старое значение.

Я стараюсь такие ситуации избегать или созданием объекта, который хранит состояние и передается кому надо, или избежанием присваивания

Вместо
def f():
global x = 1

Что-то типа

x = []
def f();
x.append(1)

Список это просто пример мутабельной структуры.

Мя :sparkles_lesbian:

@dima скорее всего, я на 90% уверена — он не может понять, что package.main это главный модуль. Поэтому он его импортирует как обычно, но функция инициализации при этом не вызывается

Мя :sparkles_lesbian:

@dima т.е там тупо два разных модуля main. Один как package.main, второй как __main__

Dima

@mo это загадка для меня. Тут надо код смотреть

Мя :sparkles_lesbian:

@dima если б я не была занята, я бы накидала MRE, но как нибудь потом.

Dima

@mo ок, у меня тоже дела

Go Up