dict属性和dict之间的区别

时间:2018-06-01 18:04:01

标签: python dictionary attributes

这来自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()的初始方法时运行正常,但是当我自己构建它时不起作用,给出了这个错误:

  

属性错误:&#39; dict&#39;对象没有属性&#39;路径&#39;

这到底出了什么问题?

1 个答案:

答案 0 :(得分:1)

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

如果您查看Learner class(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)。

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

Convert nested Python dict to object?

我建议阅读文档,阅读图书馆的代码并创建自己的小项目,而不是试图打破旨在协同工作的部分,但是由你决定如何最好地学习。< / p>