在我正在工作的大型应用程序中,有几个人以不同的方式导入相同的模块,例如导入x或从导入x导致x的副作用被导入两次,如果有人依赖于全局属性,可能会引入非常微妙的错误
例如,假设我有一个包mypakcage,包含三个文件mymodule.py,main.py和init .py
mymodule.py内容
l = []
class A(object): pass
Run Code Online (Sandbox Code Playgroud)
main.py内容
def add(x):
from mypackage import mymodule
mymodule.l.append(x)
print "updated list",mymodule.l
def get():
import mymodule
return mymodule.l
add(1)
print "lets check",get()
add(1)
print "lets check again",get()
Run Code Online (Sandbox Code Playgroud)
它打印
updated list [1]
lets check []
updated list [1, 1]
lets check again []
Run Code Online (Sandbox Code Playgroud)
因为现在在两个不同的模块中有两个列表,类似的A类是不同的对我来说它看起来很严重因为类本身将被区别对待,例如下面的代码打印False
def create():
from mypackage import mymodule
return mymodule.A()
def check(a):
import mymodule
return isinstance(a, mymodule.A)
print check(create())
Run Code Online (Sandbox Code Playgroud)
题:
有什么方法可以避免这种情况吗?除了强制执行该模块应该以单向onyl方式导入.这不能由python导入机制处理,我在django代码和其他地方也看到了与此相关的几个错误.