Проблема с полочным модулем? - PullRequest
2 голосов
/ 25 августа 2009

Использование модуля полки дало мне неожиданное поведение. keys (), iter () и iteritems () не возвращают все записи на полке! Вот код:

cache = shelve.open('my.cache')
# ...
cache[url] = (datetime.datetime.today(), value)

позже:

cache = shelve.open('my.cache')
urls = ['accounts_with_transactions.xml', 'targets.xml', 'profile.xml']
try:
    print list(cache.keys()) # doesn't return all the keys!
    print [url for url in urls if cache.has_key(url)]
    print list(cache.keys())
finally:
    cache.close()

и вот вывод:

['targets.xml']
['accounts_with_transactions.xml', 'targets.xml']
['targets.xml', 'accounts_with_transactions.xml']

Кто-нибудь сталкивался с этим раньше, и есть ли обходной путь, не зная всех возможных ключей кэша a priori ?

Ответы [ 2 ]

3 голосов
/ 25 августа 2009

Согласно справочнику библиотеки Python :

... База данных также (к сожалению) также подвержена ограничениям dbm, если она используется - это означает, что (протравленное представление) объектов, хранящихся в базе данных, должно быть довольно маленьким ...

Это правильно воспроизводит «ошибку»:

import shelve

a = 'trxns.xml'
b = 'foobar.xml'
c = 'profile.xml'

urls = [a, b, c]
cache = shelve.open('my.cache', 'c')

try:
    cache[a] = a*1000
    cache[b] = b*10000
finally:
    cache.close()


cache = shelve.open('my.cache', 'c')

try:
    print cache.keys()
    print [url for url in urls if cache.has_key(url)]
    print cache.keys()
finally:
    cache.close()

с выводом:

[]
['trxns.xml', 'foobar.xml']
['foobar.xml', 'trxns.xml']

Поэтому ответ заключается не в том, чтобы хранить что-то большое - например, в формате raw xml, - а в результатах полок.

0 голосов
/ 25 августа 2009

Видя ваши примеры, я сначала подумал, что cache.has_key() имеет побочные эффекты, то есть этот вызов добавит ключи в кеш. Что вы получаете за

print cache.has_key('xxx')
print list(cache.keys())
...