2

使用搁置模块给了我一些令人惊讶的行为。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']

以前有没有人遇到过这种情况,是否有一种解决方法,而不知道所有可能的缓存键先验

4

2 回答 2

3

根据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']

因此,答案是不要存储任何大的东西——比如原始 xml——而是将计算结果存储在一个架子上。

于 2009-08-25T08:34:06.993 回答
0

看到你的例子,我的第一个想法是cache.has_key()有副作用,即这个调用会将键添加到缓存中。你得到什么

print cache.has_key('xxx')
print list(cache.keys())
于 2009-08-25T07:48:15.963 回答