将模块导入为对象

时间:2018-05-15 21:28:08

标签: python python-3.x python-import

让我们想象一下我有两个文件

# 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()时,我都希望打印出来。

换句话说,import foo应该像创建一个新对象一样。

1 个答案:

答案 0 :(得分:0)

您可以在本地重新创建模块 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)