在我正在工作的一个大型应用程序中,几个人以不同的方式导入相同的模块,例如 import x 或 from y import x 的副作用是 x 被导入两次,如果有人依赖全局属性,可能会引入非常微妙的错误
例如,假设我有一个包含三个文件 mymodule.py、main.py 和init .py的包 mypakcage
mymodule.py 内容
l = []
class A(object): pass
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()
它打印
updated list [1]
lets check []
updated list [1, 1]
lets check again []
因为现在在两个不同的模块中有两个列表,类似地 A 类是不同的对我来说它看起来很严重,因为类本身将被不同地对待,例如下面的代码打印 False
def create():
from mypackage import mymodule
return mymodule.A()
def check(a):
import mymodule
return isinstance(a, mymodule.A)
print check(create())
问题:
有没有办法避免这种情况?除了强制该模块应该以一种方式导入外。这不能通过 python 导入机制来处理,我在 django 代码和其他地方也看到了一些与此相关的错误。