2011-09-28 12 views
7

Mam moduł z pakietu podrzędnego, który jest importowany dynamicznie; jak mogę iterować po zajęciach, które zawiera?Powtórz klasy zdefiniowane w module importowanym dynamicznie

I zostały importowanie modułu i wymieniając nazwy tak:

package = current_module.__name__ 
package = package[:package.rindex(".")] # get the package 
package = "%s.sub.%s"%(package,name) # make the name of the child 
print "(loading package %s)"%package 
module = __import__(package) # this succeeds 
for name,obj in inspect.getmembers(module): 
    print name,type(obj) 

This tylko atrybuty moduł wydruków i nie typy klasy, że moduł określa:

__builtins__ <type 'dict'> 
__doc__ <type 'NoneType'> 
__file__ <type 'str'> 
__name__ <type 'str'> 
__package__ <type 'NoneType'> 
__path__ <type 'list'> 
imported_package <type 'module'> 

UPDATE

Wygląda na to, że moje zajęcia nie są prowadzone w __dict__chyba że the jest niepusta! Wartości na liście nie wydają się jednak zatwierdzone; [""] wydaje się działać dobrze i nagle pojawiają się klasy!

Czy ktoś może wyjaśnić, dlaczego tak jest?

(Standard ubuntu pyton 2.7.1+ (r271: 86832)

Odpowiedz

17

Przykład: stworzenie dict które odwzorowuje nazwy klas:

dict([(name, cls) for name, cls in mod.__dict__.items() if isinstance(cls, type)]) 

gdzie mod jest załadowany moduł

+0

To nie działa, chyba że import ma klauzulę-listę, pytanie zostało zaktualizowane – Will

+0

O, i pomniejszy punkt, myślę, że nie jesteś w domenie bloku try? – Will

+0

(Po pierwsze) Masz rację co do spisu: zwykle używam '[ Brak] "za to." Nie wiem, dlaczego jest to konieczne. (Drugi) Nie , Naprawdę chodziło o 'isinstance', a nie' issubclass' i bez 'try'. Każda klasa jest również obiektem typu "typ". – pvoosten

Powiązane problemy