Есть ли способ получить все модули «под» определенного модуля в иерархии? - PullRequest
0 голосов
/ 31 июля 2011

Есть ли способ перечислить все модули Python непосредственно под указанной моделью в иерархии?

У меня есть веб-приложение Django, которое медленно развивается, и я реорганизовал его на основена этой статье:

http://paltman.com/2008/01/29/breaking-apart-models-in-django/

Однако я пытаюсь улучшить его технику, используя интроспекцию в файле инициализации модуля (__ init __.py), чтобыавтоматически определять все экземпляры класса модели Django в подчиненных заданиях.У меня такой вид работает, но ему все еще нужен статический список модулей в дереве над ним для работы.

В случае, если людям интересно, вот как выглядит мое решение:

from django.db.models.base import ModelBase
from sys import modules

moduleList = ['TechTree', 'PilotAbilities']
__all__ = []

for moduleName in moduleList:
  fullyQualifiedModuleName = '%s.%s' % (__name__, moduleName)
  moduleObj = __import__(fullyQualifiedModuleName)

  __all__ += [item for item in dir(moduleObj) if isinstance(getattr(moduleObj, item), ModelBase)]

Ответы [ 2 ]

1 голос
/ 01 августа 2011

Это всего лишь попытка, но, похоже, она работает. Я использую Python 2.7.1 и DIR (somemodule) дает мне все связанные модули. Протестировано с модулями openpyxl и os.

def import_all(name):
    __import__(name)
    for i in dir(name):
        try:
            if type(i) == type(name):
                import_all(name+'.'+i)
        except:
            pass

Примечание: Это, вероятно, крайне непитонно и обескуражено, но, похоже, работает.

Примечание 2: Это было потому, что у меня случайно был «openpyxl» (тест, который я использовал) вместо подмодулей списка. К сожалению

1 голос
/ 31 июля 2011

Ну, вы можете получить os.path.dirname(parent.__file__), а затем glob.glob() или os.walk() и искать другие init .py файлы.

...