首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dict属性与dict的区别

dict属性与dict的区别
EN

Stack Overflow用户
提问于 2018-06-02 02:04:01
回答 1查看 144关注 0票数 0

这是fastai库中的代码。所以这个函数调用:

代码语言:javascript
复制
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)

结果如下:

代码语言:javascript
复制
{'path': 'data/rossmann/',
 'test_dl': <fastai.dataloader.DataLoader at 0x112c93d68>,
 'trn_dl': <fastai.dataloader.DataLoader at 0x112c93e80>,
 'val_dl': <fastai.dataloader.DataLoader at 0x112c93a20>}

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

代码语言:javascript
复制
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

这就给出了:

代码语言:javascript
复制
{'path': 'data/rossmann/',
 'test_dl': <fastai.dataloader.DataLoader at 0x1c20e9cc88>,
 'trn_dl': <fastai.dataloader.DataLoader at 0x1c20d5f8d0>,
 'val_dl': <fastai.dataloader.DataLoader at 0x1c20d5f320>}

然而,当尝试在其他函数中使用它们时,它们的行为非常不同。如下所示:

代码语言:javascript
复制
m = StructuredLearner(md, StructuredModel(to_gpu(model)), opt_fn=optim.Adam)

当我使用md = ColumnarModelData()的初始方法时,它运行得很好,但当我自己构建它时,它就不起作用了,给出了这个错误:

AttributeError:'dict‘对象没有'path’属性

这里到底出了什么问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-02 03:02:21

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

如果您查看Learner class ( StructuredLearner继承它),您将看到以下两行:

代码语言:javascript
复制
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)

其中的关键部分是:

代码语言:javascript
复制
self.data = data

代码语言:javascript
复制
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?

我建议阅读文档,阅读库中的代码并创建自己的小项目,而不是试图将设计为协同工作的东西分成几个部分,但如何学习最好由您自己决定。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50648853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档