سؤال

قد أعطاني استخدام وحدة الرفوف بعض السلوك المفاجئ. مفاتيح ()، 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، إذا تم استخدامه - وهذا يعني أن (تمثيل مخلل) يجب أن تكون الكائنات المخزنة في قاعدة البيانات صغيرة إلى حد ما ...

هذا إعادة إنتاج "BUG" بشكل صحيح:

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