首页 > 解决方案 > dict属性和dict的区别

问题描述

这是来自fastai图书馆。所以这个函数调用:

md = ColumnarModelData(PATH, ColumnarDataset.from_data_frame(trn_df, cat_flds=cat_vars, y=trn_y),
                    ColumnarDataset.from_data_frame(val_df, cat_flds=cat_vars, y=val_y), bs=128, test_ds=test_ds)
vars(md)

给出这个结果:

{'path': 'data/rossmann/',
 'test_dl': <fastai.dataloader.DataLoader at 0x112c93d68>,
 'trn_dl': <fastai.dataloader.DataLoader at 0x112c93e80>,
 'val_dl': <fastai.dataloader.DataLoader at 0x112c93a20>}

但是我可以通过执行以下操作来构建相同的结果:

md = {'path':PATH, 
      'test_dl':DataLoader(test_ds, batch_size=128, shuffle=False, num_workers=1), 
      'trn_dl':DataLoader(trn_df, batch_size=128, shuffle=False, num_workers=1), 
      'val_dl':DataLoader(val_df, batch_size=128*2, shuffle=False, num_workers=1)}

md

这使:

{'path': 'data/rossmann/',
 'test_dl': <fastai.dataloader.DataLoader at 0x1c20e9cc88>,
 'trn_dl': <fastai.dataloader.DataLoader at 0x1c20d5f8d0>,
 'val_dl': <fastai.dataloader.DataLoader at 0x1c20d5f320>}

但是,当尝试在其他功能中使用它们时,它们的行为非常不同。如:

m = StructuredLearner(md, StructuredModel(to_gpu(model)), opt_fn=optim.Adam)

当我使用初始方法时它运行良好,但当md = ColumnarModelData()我自己构建它时它不起作用,出现此错误:

AttributeError:“dict”对象没有属性“path”

这里到底出了什么问题?

标签: pythondictionaryattributes

解决方案


您正在使用 var(md) 将类转换为字典,但 md 是类的实例而不是字典。类可以使用点表示法(例如 md.path)访问它们的属性,但字典不能。

如果您查看Learner 类(从中继承 StructuredLearner),您将看到以下两行:

self.data_,self.models,self.metrics = data,models,metrics
self.models_path = models_name if os.path.isabs(models_name) else os.path.join(self.data.path, models_name)

其中的关键部分是:

self.data = data

self.data.path

所以你可以看到它正在尝试使用点表示法访问数据(md)。

如果您真的想将您的 dict 转换为一个类,您可以按照以下步骤操作:https ://codeyarns.com/2017/02/27/how-to-convert-python-dict-to-class-object-with-fields/

或者

将嵌套的 Python dict 转换为对象?

我建议阅读文档,阅读库的代码并创建自己的小项目,而不是尝试将旨在协同工作的东西分解成多个部分,但这取决于你如何才能最好地学习。


推荐阅读