Итерация классов, определенных в модуле, импортированном динамически - PullRequest
8 голосов
/ 28 сентября 2011

У меня есть модуль из дочернего пакета, который импортируется динамически;Как я могу перебрать классы, которые он содержит?

Я импортировал модуль и перечислил имена, подобные этому:

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)

Это печатает только атрибуты модуля, а не типы классов, которыемодуль определяет:

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

ОБНОВЛЕНИЕ

Кажется, что мои классы не находятся в __dict__ , если fromlist не пусто!Значения в исходном списке, похоже, не проверены;[""], кажется, работает просто отлично, и вдруг появляются классы!

Может кто-нибудь объяснить, почему это так?

(Стандартный Ubuntu Python 2.7.1+ (r271: 86832)

Ответы [ 2 ]

27 голосов
/ 28 сентября 2011

Пример: создать dict, который сопоставляет имена с классами:

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

, где mod - загруженный модуль

1 голос
/ 28 апреля 2018

Если вы определяете __all__ в импортируемом модуле, который определяет, какие символы будут экспортироваться, вы можете выполнить итерацию, выбрав эти элементы специально.

map(module.__dict__.get, module.__all__)
...