문제
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())
제휴하지 않습니다 StackOverflow