2015-12-17 27 views
3

我创建了以下类。包,网站和评论都是字符串,distroDict是一个(字符串,列表)字典。Python - 使用defaultdict制作自定义对象字典

class TableEntry(object): 

    def __init__(self, package, website, distroDict, comments): 
     self.package = package 
     self.website = website 
     self.distroDict = distroDict 
     self.comments = comments 

我想使用defaultdict(TableEntry)来制作一个(字符串,TableEntry)自定义字典。

tableDict = defaultdict(TableEntry) 
entry = TableEntry(package, website, distroDict, comments) 
tableDict[package].append(entry) 

我想要包是关键和入口对象是价值。我可以使用入口对象内的值,但是如果我尝试将它附加到tableDict,我会收到以下错误。

Traceback (most recent call last): 
    File "wiki.py", line 151, in <module> 
    printMetaData(lines, f) 
    File "wiki.py", line 73, in printMetaData 
    tableDict[package].append(entry) 
TypeError: __init__() takes exactly 5 arguments (1 given) 

我也曾尝试以下操作:

tableDict[package].append(TableEntry(package, website, distroDict, comments)) 

和接收实质上相同的错误:当您尝试从defaultdict得到的东西,它返回的一个实例

Traceback (most recent call last): 
    File "wiki.py", line 150, in <module> 
    printMetaData(lines, f) 
    File "wiki.py", line 73, in printMetaData 
    tableDict[package].append(TableEntry(package, website, distroDict, comments)) 
TypeError: __init__() takes exactly 5 arguments (1 given) 
+4

是不是这是一个表条目列表,所以你不想'defaultdict(列表)'你'附加'TableEntry's?默认的dict需要一个零参数函数来创建它的默认值,所以你实际上不能执行'defaultdict(TableEntry)'。 – AChampion

+0

@AChampion wouldnt'defaultdict(list)'给我一个字典{string,[list]}?而我正在寻找与{字符串,TableEntry}字典。我需要将一个字符串映射到一个对象,而不是可以容纳多条信息和一个字符串,列表字典是不够的。如果我不能执行'defaultdict(TableEntry)'我该怎么做到这一点? – javakid1993

+0

'defaultdist(list)'会给你一个{string:[]}字典,但是当你附加一个'TableEntry'时,你需要一个集合,例如。 {字符串:[TableEntry,TableEntry,...]}的字典。然而,如果你只是想要一个'{string:TableEntry}'的字典'为什么你需要一个'defaultdict',不会'tableDict = {}; tableDict [package] = TableEntry(...)'不起作用? – AChampion

回答

2

default_factory你实例化它,你的情况是TableEntry没有方法append。但这其实不是你得到这个错误的原因。发生这种情况是因为当一个实例返回时它也会被计算,并且由于TableEntry没有它需要的参数,所以Python解释器会报错。但即使TableEntrydefaultdict调用中被赋予参数,您可能会得到TypeError,因为defaultdict需要使用可调用对象(而不是类的实例,因为它是)。

总之,你不能实例化一个不可召回的defaultdict unless you use subclassing。相反,你应该这样做:

class TableEntry(object): 
    def add(self, package, website, distroDict, comments): 
     self.package = package 
     self.website = website 
     self.distroDict = distroDict 
     self.comments = comments 

tableDict = defaultdict(TableEntry) 
entry = ("package", "website", "distroDict", "comments") 
tableDict["package"].add(*entry) 

然后,你可以做tableDict["package"]["website"]获取您写入self.website的字符串。