Импорт модуля как объекта - PullRequest
0 голосов
/ 16 мая 2018

Давайте представим, у меня есть два файла

# foo.py
a = 5

и

#bar.py
def call_foo():
    import foo
    foo.a += 1
    print(foo.a)

call_foo() # Prints 6
call_foo() # Prints 7

Мне бы хотелось, чтобы каждый раз, когда я звоню call_foo(), 6 было напечатано.

Другими словами, import foo должен действовать как создание нового объекта.

1 Ответ

0 голосов
/ 16 мая 2018

Вы можете воссоздать модуль globals локально, избегая изменения его глобального состояния, например ::

def call_foo():
    import foo
    foo_globals = foo.__dict__.copy()  # shallow copy, be careful!
    foo_globals["a"] += 1
    print(foo_globals["a"])

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

import sys

def call_foo():
    sys.modules.pop("foo", None)
    import foo
    foo.a += 1
    print(foo.a)
...