문제

Shelve 모듈을 사용하면 놀라운 행동이 주어졌습니다. 키 (), 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']

누구든지 이전 에이 문제를 해결했으며 가능한 모든 캐시 키를 모르고 해결 방법이 있습니까? 선험적으로?

도움이 되었습니까?

해결책

에 따르면 파이썬 라이브러리 참조:

... 데이터베이스는 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과 같은 큰 것을 저장하지 않지만 선반에 계산 결과를 보는 것입니다.

다른 팁

당신의 모범을 보면, 나의 첫 번째 생각은 그 것입니다 cache.has_key() 부작용이 있습니다. 즉,이 호출은 캐시에 키를 추가합니다. 당신은 무엇을 얻습니까?

print cache.has_key('xxx')
print list(cache.keys())
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top