2011-12-03 61 views
0

我正在使用tcdb來保存一個大的鍵值存儲。鍵是表示用戶ID的字符串,值的形式python:在東京內閣商店增加值

{'coord':0,'node':0,'way':0,'relation':0} 

該店在具有座標,節點,方式和關係的對象的數據文件填充迭代中,每個連接到一個特定的用戶的類型的字典。這是我的代碼遞增字段:

def increment(self,uid,typ): 
    uid = str(uid) 
    type = str(typ) 
    try: 
     self.cache[uid][typ] += 1 
    except KeyError: 
     try: 
      self.cache[uid][typ] = 1 
     except KeyError: 
      try: 
       print 'creating record for %s' % uid 
       self.cache[uid] = {'coord':0,'node':0,'way':0,'relation':0} 
      except KeyError: 
       print 'something\'s messed up' 

這是行不通的。我結束了與具有全零個值的表:

def result(self): 
    print 'cache is now %i records' % len(self.cache) 
    for key in self.cache: 
     print key + ': ' + str(self.cache[key]) 

產量:

... 
4951: {'node': 0, 'coord': 0, 'relation': 0, 'way': 0} 
409553: {'node': 0, 'coord': 0, 'relation': 0, 'way': 0} 
92274: {'node': 0, 'coord': 0, 'relation': 0, 'way': 0} 
259040: {'node': 0, 'coord': 0, 'relation': 0, 'way': 0} 
... 

爲什麼?

最後一個異常不會被調用。

編輯這段代碼在第一try塊:

 tempdict = self.cache[uid] 
     tempdict[typ] = tempdict.get(typ,0) + 1 
     self.cache[uid] = tempdict 

代替了原來的

 self.cache[uid][typ] += 1 

作品,但看起來真的很醜我。

+0

'coord','node','way'或'relation'。 – mvexel

+0

我插入了輸出表格的代碼。 – mvexel

+0

抱歉,這是從引入更多密鑰的不同版本輸出的。糾正。 – mvexel

回答

2

這一行後:

self.cache[uid] = {'coord':0,'node':0,'way':0,'relation':0} 

補充一點:

self.cache[uid][type] = 1 

另外,請不要因爲它隱藏了同名的內置使用type作爲變量名。

+0

這可以在'self.cache = {}'時運行,但如果'self.cache = tdb.TDB()'不能運行,那麼tcdb會有一些特定的錯誤, – mvexel

+0

另外,我確實在變量的名稱中改爲「typ」,謝謝。 – mvexel