【问题标题】:Difference between dict attributes and dictdict属性和dict的区别
【发布时间】:2018-06-01 18:04:00
【问题描述】:

这是来自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'

这里到底出了什么问题?

【问题讨论】:

  • 你能添加你正在使用的库吗?
  • @Zev 将库添加到问题中:fastai
  • 您知道您只能看到返回的对象的“部分” - 取决于您打印的时间/方式,您会得到它的__str__() 或它的__repr__() 打印。它可能需要您提到的许多其他功能未打印但使用的其他功能不适用于您的“重构”结果字典。
  • mdvars(md) 不是一回事。
  • 它需要path 属性,md 具有该属性。 vars(md) 生成一个字典,其中这些属性成为独立且不同的键/值。 vars(md)['path'] 存在,而不是 vars(md).path

标签: python dictionary attributes


【解决方案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)。

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

Convert nested Python dict to object?

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

【讨论】:

  • 这很有帮助。它还帮助我更好地理解 OOP,因为到目前为止我只是定义了函数并直接使用它们,没有对象。
猜你喜欢
  • 2018-05-18
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-14
  • 2016-03-26
  • 2016-09-02
相关资源
最近更新 更多