Post ATg1Qdig9XOUBLAYt6 by dima@social.3dots.lv
(DIR) More posts by dima@social.3dots.lv
(DIR) Post #ATfiapeIkwhcwmGhs0 by mo@mastodon.ml
2023-03-16T11:36:28Z
0 likes, 0 repeats
Что за ебаная магияВот есть в главном модуле глобальная переменнаяrmq_connectionтакже, есть on_startup хук в aiogram, который подключается и присваивает ей значениеа ещё есть хендлер, который делает внутри себя import main и потом берет это значениеТак вот, в хендлере по непонятным причинам видно только старое значение, заданное до выполнения on_startup....
(DIR) Post #ATfigBp5k0bPANs0mW by mo@mastodon.ml
2023-03-16T11:37:27Z
0 likes, 0 repeats
inb4: on_startup присваивает значение именно глобальной переменной, а не в своем скоупеasync def init(...): global rmq_connection ...
(DIR) Post #ATfziP3VDFAe0RFgLA by mo@mastodon.ml
2023-03-16T14:48:20Z
0 likes, 0 repeats
Фан факт, проблема вылечилась импортом магического модуля __main__ и затыканием ide по поводу того, что такого пакета нет в зависимостяхОказывается, для питона это разные модули, и если импортировать main по его пути, без магии, то он его загрузит заново....
(DIR) Post #ATg0IbMuuU2ucTas9A by dima@social.3dots.lv
2023-03-16T14:54:52Z
0 likes, 0 repeats
@mo Если первый вариант был такимfrom main import rmq_connectionТо новые значения rmq_connection не будут видны.import main....print(main.rmq_connection)Должен видеть новое значение.
(DIR) Post #ATg0jdbkgzlLNpQNxQ by mo@mastodon.ml
2023-03-16T14:59:46Z
0 likes, 0 repeats
@dima а хуй там, он даже так видит значение до инициализации :)и да, оно там не меняется. Оно один раз лениво инициализируется, и уже после этого используется в нижележащих модуляхПросто для его инициализации нужен IO, а используется оно одно на всю программу (потому что установка соединения это относительно затратно, и поэтому в RabbitMQ есть свой уровень мультиплексирования — каналы)
(DIR) Post #ATg1Qdig9XOUBLAYt6 by dima@social.3dots.lv
2023-03-16T15:07:29Z
0 likes, 0 repeats
@mo интересно, но не понятно, почему он видит старое значение.Я стараюсь такие ситуации избегать или созданием объекта, который хранит состояние и передается кому надо, или избежанием присваиванияВместоdef f(): global x = 1Что-то типаx = []def f(); x.append(1)Список это просто пример мутабельной структуры.
(DIR) Post #ATg1XqxLL1ivGGT5Iu by mo@mastodon.ml
2023-03-16T15:08:51Z
0 likes, 0 repeats
@dima скорее всего, я на 90% уверена — он не может понять, что package.main это главный модуль. Поэтому он его импортирует как обычно, но функция инициализации при этом не вызывается
(DIR) Post #ATg1aTpVmHJKPB3dE8 by mo@mastodon.ml
2023-03-16T15:09:20Z
0 likes, 0 repeats
@dima т.е там тупо два разных модуля main. Один как package.main, второй как __main__
(DIR) Post #ATg1mOSLaAslDKu4Dg by dima@social.3dots.lv
2023-03-16T15:11:17Z
0 likes, 0 repeats
@mo это загадка для меня. Тут надо код смотреть
(DIR) Post #ATg235n2EjPSFDXhey by mo@mastodon.ml
2023-03-16T15:14:31Z
0 likes, 0 repeats
@dima если б я не была занята, я бы накидала MRE, но как нибудь потом.
(DIR) Post #ATg290TCvcc9U05YCu by dima@social.3dots.lv
2023-03-16T15:15:24Z
0 likes, 0 repeats
@mo ок, у меня тоже дела