Frage

Die Verwendung des Regalmoduls hat mir ein überraschendes Verhalten gegeben. Keys (), iter () und iteritems () geben nicht alle Einträge im Regal zurück! Hier ist der Code:

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

später:

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()

Und hier ist die Ausgabe:

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

Ist jemand schon einmal darauf getroffen und gibt es eine Problemumgehung, ohne alle möglichen Cache -Tasten zu kennen? a priori?

War es hilfreich?

Lösung

Laut dem Python Library Referenz:

... Die Datenbank unterliegt (leider) auch den Einschränkungen von DBM, falls sie verwendet wird. Dies bedeutet, dass (die eingelegte Darstellung von) die in der Datenbank gespeicherten Objekte ziemlich klein sein sollten ...

Dies reproduziert den "Fehler" korrekt:

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()

mit der Ausgabe:

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

Die Antwort ist daher nichts Großes - wie rohes XML -, sondern eher die Ergebnisse von Berechnungen in einem Regal.

Andere Tipps

Wenn ich deine Beispiele sehe, ist mein erster Gedanke das cache.has_key() Hat Nebenwirkungen, dh dieser Anruf wird dem Cache Schlüssel hinzufügen. Wofür bekommst du?

print cache.has_key('xxx')
print list(cache.keys())
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top