2015-12-17 76 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的字符串。