代码之家  ›  专栏  ›  技术社区  ›  Nick

使用反射从包中加载和实例化模块?

  •  1
  • Nick  · 技术社区  · 6 年前

    我有一个叫 models 包含 __init__.py , model_a.py , model_b.py .

    我的 _初始版本 包含:

    from models.model_a import ModelA
    from models.model_b import ModelB
    

    在我的 main.py 我愿意

    import models
    
    model = get_model(config.use_model) #config.use_model == "ModelA"
    
    def get_model(model):
        # This should be equivalent to models.ModelA(**config.ModelA.structure)
        return models[model](**config[model].structure)
    

    会引发错误 TypeError: 'module' object is not subscriptable

    基本上,我想做的是优雅地加载配置中设置的模型。这样访问配置很好。

    2 回复  |  直到 6 年前
        1
  •  2
  •   ash    6 年前

    您正在尝试进行编程属性访问,因此需要使用 getattr 功能:

    return getattr(models, model)(**config[model].structure)
    

    订阅(带方括号,如 foo[1] )与属性访问不同(带有点,如 foo.bar )和 foo[2] 意味着不同于 foo(2) .

        2
  •  2
  •   Druta Ruslan    6 年前

    我不知道是不是写的,但你可以试试这个,

    import models
    import sys
    
    def get_model(model):
        return getattr(models, model)
    
    
    model = get_model('ModelA')
    print(model())