2011-12-03 21 views
0

私はtcdbを使用して大きなキー値ストアを保持しています。キーはユーザーIDを表す文字列であり、値がフォームpython:tokyoキャビネットストアの値を増やす

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

のdictsている店舗は、それぞれが特定のユーザにリンクされ、COORD、ノード、方法及び関連オブジェクトを有するデータファイルの繰り返し処理を充填されています。フィールドをインクリメントするコードは次のとおりです。

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ブロック内

EDITこのコード:代わりに、元

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

作品の

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

が、私には本当に醜いです。この行の後

+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