Python调用类内部嵌套类触发NameError: config未定义如何解决
报错原因&解决方案
核心报错原因
config是Preprocess类的内部嵌套类,全局作用域不存在直接叫config的变量,需要通过Preprocess.config访问该内部类- 传入的数据集名称
Cora是字符串类型,缺少引号会被识别为未定义变量 - 原类定义中
__init__、get_data方法的缩进不匹配,会导致方法不属于Preprocess类,也会触发属性不存在的报错
修改后的完整代码
from torch_geometric.datasets import Planetoid from torch_geometric.data import DataLoader class Preprocess(): class config(): root_dir = './data/' batch_size = 1 hidden_dim = 16 dropout_rate = 0.5 l2_reg = 5*10e-4 learning_rate = 0.01 epochs = 200 loss_type = 'cross_entropy' # or nll_loss def __init__(self, config, d_name): self.root_dir = config.root_dir self.batch_size = config.batch_size self.cora = Planetoid(root='./data/cora', name='Cora') #self.citeseer = Planetoid(root='./data/citeseer', name='CiteSeer') #self.pubmed = Planetoid(root='./data/pubmed', name='PubMed') self.num_classes, self.num_node_features, self.data = self.get_data(d_name) def get_data(self, d_name): ''' d_name = 'Cora', 'CiteSeer', 'PubMed' ''' dataset = Planetoid(root=self.root_dir + d_name , name=d_name) return dataset.num_classes, dataset.num_node_features, DataLoader(dataset, batch_size = self.batch_size) # 正确实例化方式 f = Preprocess(Preprocess.config, 'Cora') # 可直接访问实例初始化时已经加载好的数据 print(f.num_classes, f.num_node_features) # 如果需要单独调用get_data方法,写法如下 # res = f.get_data('Cora')
额外优化建议
如果默认就是用内部的config类,不需要额外传参的话,可以把__init__方法的config参数设置默认值,实例化的时候更方便:
# 修改__init__定义 def __init__(self, d_name, config=config): # 其余逻辑不变 # 实例化时只需要传数据集名称即可 f = Preprocess('Cora')
内容的提问来源于stack exchange,提问作者muhammad
相关产品推荐
相关产品推荐

