2012-11-04 8 views
8

Mam klasę biblioteki, w zależności od tego, w jaki sposób jest ona importowana, metodę, która polega na self.__module__ dla zachowania zmian identyfikacyjnych - w zależności od tego, czy importuję ją względnie czy absolutnie. Czy istnieje sposób na wymuszenie, aby atrybut self.__name__ klasy wrócił całkowicie?Uzyskaj moduł self____ klasy niezależnie od sposobu importowania.

Zdaję sobie sprawę, że jednym z rozwiązań byłoby zmusić wszystkich do importowania podklas w ten sam sposób, ale zastanawiał się, czy istnieje sposób, aby zmusić go z punktu widzenia biblioteki.

skrócone Struktura

Mam moduł w bibliotece

project/ 
    mylib/ 
     foo.py 
      LibraryClass 
      def get_name(self): 
       return "%s.%s.%s" % \ 
        (self.__module__, self.__class__.__name__, self.some_init_property) 
    prog/ 
     utils.py 
      fooClass(LibraryClass) 
     bar.py 
      def some_func() 
       #see below 

W mylib, mam import importer wszystkie podklasy LibraryClass poprzez ciąg classname w ustawieniach naszego projektu Django plik.

Zasadniczo obserwowane zachowanie zależy od sposobu importowania. więc istnieją dwa zachowania Obserwuję w bar.py:

def some_func_absolute(): 
    from prog.utils import fooClass 
    f = fooClass("lalala") 
    print f.get_name() 
    #prints prog.utils.fooClass.lalala 

Versus

def some_func_relative(): 
    from utils import fooClass 
    f = fooClass("lalala") 
    print f.get_name() 
    #prints foo.fooClass.lalala 
+0

Czy próbowałeś użyć importu względnego 'from .utils import fooClass' zamiast' from utils import fooClass'? – Bakuriu

+3

Czy masz dwa wpisy w sys.path, które prowadzą do tych modułów? Nigdy nie widziałem zachowania, które opisujesz, ale domyślam się, że masz sys.path "" lub ". to znaczy, że dostaniesz się tam raz, a drugi to pełna ścieżka. – JimP

+0

@JimP - okazało się, że mieliśmy podwójny import na mylib/i foo/level (w naszej większej strukturze projektu) - który rozwiązał ten problem. Chciałbym dać odpowiedź na problem strukturalny, który mieliśmy. – dmyung

Odpowiedz

2

Podejrzewam, że słuszne jest, aby nigdy nie mają katalogi rodzic/dziecko w ścieżce Pythona. Podejrzewam również, że może to nie być możliwe, zważywszy na to, że tak. W zależności od tego, co robisz, może mógłbyś zamiast tego użyć formatu .__file__, który powinien być spójny niezależnie od sposobu importowania?

Powiązane problemy