В большом приложении, в котором я работаю, несколько человек по-разному импортируют одни и те же модули, например,
импорт х
или же
из у импорта х
побочные эффекты этого x импортируются дважды и могут привести к очень тонким ошибкам, если кто-то полагается на глобальные атрибуты
например. Предположим, у меня есть пакет mypakcage с тремя файлами mymodule.py, main.py и init .py
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 []
потому что теперь есть два списка в двух разных модулях, аналогично класс А отличается
Для меня это выглядит достаточно серьезно, потому что сами классы будут относиться по-разному
например код ниже печатает 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 и в других местах.