遇TypeError: getattr()属性名需为字符串,无法调用models目录模型求解决
解决
TypeError: getattr(): attribute name must be string问题 问题原因
这个错误的核心是args.model的值不是字符串,大概率是运行代码时未通过命令行指定--model参数,导致args.model为None,而getattr()的第二个参数要求必须是字符串类型。
另外需要确认models目录结构是否正确:models文件夹下应有对应模型的.py文件(如brits.py、rits.py、rits_i.py),每个文件里都定义了Model类,这样getattr(models, args.model)才能正确加载对应模块。
解决方案
1. 正确运行代码(必须指定模型参数)
运行代码时,必须通过命令行传入--model参数,同时补充其他必填参数,示例命令:
python main.py --model brits --hid_size 64 --impute_weight 0.3 --label_weight 1.0
替换brits为你需要的模型(rits/rits_i),并根据需求调整hid_size、impute_weight、label_weight的值。
2. 优化参数解析(避免遗漏必填参数)
修改argparse部分,给--model添加required=True,强制用户必须传入该参数,同时添加帮助提示:
parser = argparse.ArgumentParser() parser.add_argument('--epochs', type=int, default=1000) parser.add_argument('--batch_size', type=int, default=32) # 添加required=True和帮助提示 parser.add_argument('--model', type=str, required=True, help='指定要使用的模型,可选值:brits, rits, rits_i') parser.add_argument('--hid_size', type=int) parser.add_argument('--impute_weight', type=float) parser.add_argument('--label_weight', type=float) args = parser.parse_args()
3. 添加参数校验(提前拦截无效输入)
在run()函数开头添加校验逻辑,确保args.model是有效的模型名称:
def run(): # 校验模型名称合法性 valid_models = ['brits', 'rits', 'rits_i'] if args.model not in valid_models: raise ValueError(f"无效的模型名称,可选值:{', '.join(valid_models)}") model = getattr(models, args.model).Model(args.hid_size, args.impute_weight, args.label_weight) # 后续代码...
4. 确认models目录结构
确保项目结构如下:
你的项目目录/ ├── main.py ├── models/ │ ├── __init__.py # 空文件即可,让Python识别为模块 │ ├── brits.py │ ├── rits.py │ └── rits_i.py ├── ...其他文件(utils.py、data_loader.py等)
每个模型文件(如brits.py)里必须包含Model类定义,示例结构:
# models/brits.py class Model(nn.Module): def __init__(self, hid_size, impute_weight, label_weight): super(Model, self).__init__() # 模型初始化逻辑... def run_on_batch(self, data, optimizer=None, epoch=None): # 模型前向/训练逻辑...
内容的提问来源于stack exchange,提问作者goksu1903
相关产品推荐
相关产品推荐

