Изменить глобальный модуль, используя функцию в другом в Python - PullRequest
0 голосов
/ 11 ноября 2019

ПРИМЕЧАНИЕ. Существует аналогичный вопрос с ответом, который не отвечает на мой вопрос или является неправильным: Как изменить переменную модуля из другого модуля?

У меня есть 2 модуля:

module1::G_VAR   # module global
module1::G_VAR_changer()   # changes the module global
module2::call_G_VAR_changer()   # calls G_VAR_changer()

Это работает:

# from module2:
# call_G_VAR_changer() -> module1::G_VAR_changer() -> module1::G_VAR *is changed*

Это не работает:

# from module1:
import module2
# module2::call_G_VAR_changer() -> module1::G_VAR_changer() -> module1::G_VAR *is NOT changed*

Код:

module1.py

import module2

def call_G_VAR_changer():
    print('m1: before: m2.G_VAR: ' + module2.G_VAR)
    module2.G_VAR_changer()
    print('m1: after: m2.G_VAR: ' + module2.G_VAR)

if __name__ == '__main__':
    print('m1: before: m2.G_VAR: ' + module2.G_VAR)
    call_G_VAR_changer()
    print('m1: after: m2.G_VAR: ' + module2.G_VAR)

module2.py

import module1

G_VAR='default'

def G_VAR_changer():
    print('m2.G_VAR_changer')
    global G_VAR
    G_VAR='changed'

if __name__ == '__main__':
    print('m2: before: m2.G_VAR: ' + G_VAR)
    module1.call_G_VAR_changer()
    print('m2: after: m2.G_VAR: ' + G_VAR)

Работает:

$ python3 module1.py 
m1: before: m2.G_VAR: default
m1.call_G_VAR_changer
m1: before: m2.G_VAR: default
m2.G_VAR_changer
m1: after: m2.G_VAR: changed
m1: after: m2.G_VAR: changed   # !!! the changer function changed it

Это не работает:

$ python3 module2.py 
m2: before: m2.G_VAR: default
m1.call_G_VAR_changer
m1: before: m2.G_VAR: default
m2.G_VAR_changer
m1: after: m2.G_VAR: changed   # it seems it managed to change the value
m2: after: m2.G_VAR: default   # !!! but it failed to change it

ВОПРОС:

Меня интересуют как объяснение, так и обходной путь.

ПРИМЕЧАНИЯ:

Обратите внимание, что module1 импортирует module2, и наоборот, таким образом, существует циклический импорт. Я проверил это без циклического импорта, и он отлично работает.

Я также пытался протестировать из-за того, что есть как-то 2 экземпляра / пространства имен с 2 различными G_VAR-ами, но мои эксперименты ни к чему не привели.

Я подозреваю, что эта проблема сводится к циклической ссылке и каким-то образом к пространству имен.

Я даже не знаю, является ли это ожидаемым поведением, или, возможно, ошибка в python?

Версия Python: Python 3.5.3


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...