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

时间:2018-05-23 14:10:41

标签: python

我有一个名为models的包(文件夹) __init__.pymodel_a.pymodel_b.py

我的__init__.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 个答案:

答案 0 :(得分:2)

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

import models
import sys

def get_model(model):
    return getattr(models, model)


model = get_model('ModelA')
print(model())  

答案 1 :(得分:2)

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

static Future<User> getUser(String userKey) async {
Completer<User> completer = new Completer<User>();

String accountKey = await Preferences.getAccountKey();

FirebaseDatabase.instance
    .reference()
    .child("accounts")
    .child(accountKey)
    .child("users")
    .childOrderBy("Group_id")
    .equals("54")
    .once()
    .then((DataSnapshot snapshot) {
  var user = new User.fromSnapShot(snapshot.key, snapshot.value);
  completer.complete(user);
});

return completer.future;
  }
}

class User {
  final String key;
  String firstName;

  Todo.fromJson(this.key, Map data) {
    firstname= data['Firstname'];
    if (firstname== null) {
      firstname= '';
    }
  }
}

订阅(方括号,如return getattr(models, model)(**config[model].structure) )与属性访问(带点,如foo[1])不同,与foo.bar表示不同的方式完全相同到foo[2]