python: увеличение значений в токийском магазине - PullRequest
0 голосов
/ 03 декабря 2011

Я использую tcdb для хранения большого хранилища ключей.Ключи - это строки, представляющие идентификаторы пользователей, значения - это диктанты формы

{'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

работает, но выглядит мне безобразно.

1 Ответ

2 голосов
/ 03 декабря 2011

После этой строки:

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

Добавить это:

self.cache[uid][type] = 1

Также, пожалуйста, не используйте type в качестве имени переменной, поскольку оно скрывает встроенное имя с таким же именем.

...