Как избежать конфликтов имен в модульной системе Python? - PullRequest
6 голосов
/ 17 ноября 2011

В моем проекте Django у меня есть приложение под названием profile, которое в основном содержит мой класс profile.models.UserProfile для дополнительной информации о User объектах (может показаться знакомым людям из Django).Теперь я поместил некоторый код инициализации в profile/__init__.py (некоторые сигналы) и столкнулся с проблемой: Django говорит мне, что таблица с именем hotshot_profile не была найдена.

После буквальных часов поиска,Я проследил проблему до импорта заказа.Запустив python -v manage.py test Я обнаружил следующее:

import nose.plugins.prof # precompiled from /home/rassie/.virtualenvs/myproject/lib/python2.6/site-packages/nose/plugins/prof.pyc
import hotshot # directory /usr/lib64/python2.6/hotshot
import hotshot # precompiled from /usr/lib64/python2.6/hotshot/__init__.pyc
dlopen("/home/rassie/.virtualenvs/myproject/lib64/python2.6/lib-dynload/_hotshot.so", 2);
import _hotshot # dynamically loaded from /home/rassie/.virtualenvs/myproject/lib64/python2.6/lib-dynload/_hotshot.so
import hotshot.stats # from /usr/lib64/python2.6/hotshot/stats.py
import profile # directory /home/rassie/MyProject/apps/profile
import profile # precompiled from /home/rassie/MyProject/apps/profile/__init__.pyc

Так что мой бегун Nose импортирует nose.plugins.prof (даже если этот плагин отключен), импортирует hotshot, который пытается импортировать profile,Однако profile импортируется из моего проекта , в то время как его готовность должна была быть импортирована из системы Python.

Очевидно, мой собственный модуль profile конфликтует с модулем системы profile.Очевидно, я не могу исключить каждое имя модуля, поставляемое в комплекте с Python, из моего собственного программирования.Итак, вопрос в том, куда мне идти отсюда?Нужно ли создавать пространство имен myproject для всех моих приложений?Будет ли Django работать с этим?

PS: Имя таблицы hotshot_profile, похоже, происходит от еще одного, еще не полностью проанализированного конфликта имен с классом Profile из pybb, который я 'Я также использую в моем проекте.Но это выходит за рамки этого вопроса.

1 Ответ

5 голосов
/ 17 ноября 2011

Вы никогда не должны импортировать свои собственные модули в форме import mymodule (относительный импорт).Вместо этого вы должны всегда использовать import myproject.mymodule (абсолютный импорт).Это позволяет избежать всех конфликтов имен.

...