【问题标题】:Is there a way to get all modules 'under' a specific module in the hierarchy?有没有办法让所有模块“在”层次结构中的特定模块下?
【发布时间】:2011-10-16 22:05:14
【问题描述】:

有没有办法在层次结构中的指定模型下直接列出所有 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)]

【问题讨论】:

    标签: python django introspection


    【解决方案1】:

    这只是一种尝试,但它似乎有效。我正在运行 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”(我正在使用的测试)而不是列表子模块。对不起

    【讨论】:

    • 奇怪的是,当我尝试这个时,我只得到了这个对象已导入的模块列表(而不是存在于“树”中的模块列表)。
    • 好吧,我已经设法找到了一个不同的解决方案 - 所以不要太担心它。不过,如果您有什么想法,我很想听听。
    • 这个应该修复了,我会做一些测试
    【解决方案2】:

    好吧,你可以得到os.path.dirname(parent.__file__),然后是glob.glob()os.walk(),然后寻找其他init.py文件。

    【讨论】:

    • 有点笨拙,但它可能是唯一可行的选择(鉴于缺乏其他响应)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 2016-05-31
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多