python - 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”
这里到底出了什么问题?
解决方案
您正在使用 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/
或者
我建议阅读文档,阅读库的代码并创建自己的小项目,而不是尝试将旨在协同工作的东西分解成多个部分,但这取决于你如何才能最好地学习。
推荐阅读
- angular - Ionic 4 设置身份验证时跳过登录页面
- java - 如何在 JUnit 测试中使用 Mockito?
- macos - QtCreator - 全新安装 - 2 个错误
- bash - 我需要在 ssh 连接后执行命令,但有命令替换
- image - 扩展灰度图像以适合 RGB 图像
- spring-boot - 不知道如何将其视为谓词
- php - php5.6 无法获取会话变量,然后删除该变量
- c - 如何编译/链接/构建小型可加载内核模块(LKM)?
- botframework - 是否可以在单个机器人中使用由 Bot Framework Composer 生成的多个自适应对话框?
- python - Django-Access 动态创建模型