TypeError错误:'Namespace'对象不支持项赋值问题排查
问题分析与解决
错误原因
argparse.parse()返回的是Namespace对象,它通过**属性访问(.)**来操作参数,不支持字典式的键值赋值([]),所以args["patch_data"] = c这种写法会抛出TypeError。
解决方法
方法1:直接使用属性赋值(推荐)
把字典式赋值改成属性赋值即可,这是Namespace对象的标准用法:
args = run_model_opts.RunModelOpts().parse() log = logger.Logger(args) for c in wtd_patch_list_final: if __name__ == '__main__': args.patch_data = c # 改用属性赋值 torch.manual_seed(args.seed) main(args)
方法2:将Namespace转换为字典
如果你习惯用字典操作,可以用vars()函数把Namespace转换成普通字典,这样就能用键值赋值了:
args = vars(run_model_opts.RunModelOpts().parse()) # 转换为字典 log = logger.Logger(args) for c in wtd_patch_list_final: if __name__ == '__main__': args["patch_data"] = c torch.manual_seed(args["seed"]) # 注意此处也要改成字典访问 main(args)
⚠️ 注意:转换为字典后,所有原本的args.xxx属性访问都要改成args["xxx"],否则会报错。
额外注意事项
你在添加参数时设置了type=list,这在argparse中可能不符合预期:
- argparse的
type参数是用来转换命令行输入的字符串的,比如命令行输入--patch_data abc,type=list会把字符串"abc"转换成列表['a','b','c'],这大概率不是你想要的。 - 建议根据实际需求调整参数定义:
# 若仅程序内部赋值,可设为默认空列表,无需指定type self.parser.add_argument('--patch_data', default=[], type=None) # 若需从命令行传入逗号分隔的列表,可设type=str,后续手动拆分 self.parser.add_argument('--patch_data', default="", type=str) # 程序内部处理示例:args.patch_data = args.patch_data.split(',') if args.patch_data else []
内容的提问来源于stack exchange,提问作者greeksalad
相关产品推荐
相关产品推荐

