W moim projekcie Django mam aplikację o nazwie profile
, która zawiera głównie moją klasę profile.models.UserProfile
w celu uzyskania dodatkowych informacji na temat obiektów User
(może wydawać się znajomym osobom Django). Teraz wprowadziłem kod inicjujący do profile/__init__.py
(niektóre sygnały) i wystąpił problem: Django mówi mi, że nie znaleziono tabeli o nazwie hotshot_profile
.Jak uniknąć konfliktów nazw w systemie modułów Pythona?
Po dosłownie kilku godzinach przeszukano problem z powrotem do zamówienia importowania. Uruchamianie python -v manage.py test
Znalazłem następujące:
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
Więc mój nos biegacz importuje nose.plugins.prof
(choć ten plugin jest wyłączony), import hotshot
, która stara się importować profile
. Jednak profile
zostanie zaimportowany z mojego projektu, natomiast powinien być zaimportowany z systemu Python.
Oczywiście, mój własny moduł profile
koliduje z modułem systemu profile
. Oczywiście nie mogę wykluczyć każdej nazwy modułu, która jest dołączona do Pythona z mojego własnego programowania. Pytanie brzmi: dokąd zmierzam? Czy muszę utworzyć przestrzeń nazw myproject
dla wszystkich moich aplikacji? Czy Django będzie z tym pracował?
PS: nazwa tabeli za hotshot_profile
wydaje się pochodzić z jeszcze dalej-do-pełni-analizowanym nazewnictwa starcia z Profile
klasy z pybb
, które Używam również w moim projekcie. Ale to nie dotyczy zakresu tego pytania.
Zawsze uważałem, że użyłem bezwzględnego importu, postępując zgodnie z każdą radą na temat Django, którą mogłem znaleźć. Wygląda na to, że muszę umieścić moje aplikacje w przestrzeni nazw, a następnie w globalnej ścieżce i zaimportować je zgodnie z twoją wolą. Zobaczymy, czy to pójdzie dobrze :) –