Domanda

Per questo esempio, ho un dizionario, che quando chiamo su di esso, "Ember Attack" viene visualizzato.

#import shelve
class Pokemon():
"""Each pokemon's attributes"""

def __init__(self):
    self.id=[]
    self.var1=[]
    self.var2=[]
    self.var3=[]
    self.var4=[]
    self.var5=[]

def __str__(self):
     showList=['id','var1', 'var2', 'var3', 'var4', 'var5']

#dict1=shelve.open("shelve.dat")
dict1={}
dict1["Charmander"]=Pokemon()
dict1["Charmander"].var1="Ember Attack"
#dict1.sync()
print dict1["Charmander"].var1
#dict1.close()

Tuttavia quando ho iniziare a utilizzare scaffali al posto del dizionario, ho un vuoto quando chiamo il var1.

import shelve

class Pokemon():
"""Each patient's attributes"""

def __init__(self):
    self.id=[]
    self.var1=[]
    self.var2=[]
    self.var3=[]
    self.var4=[]
    self.var5=[]

def __str__(self):
    showList=['id','var1', 'var2', 'var3', 'var4', 'var5']

dict1=shelve.open("shelve.dat")
#dict1={}

dict1["Charmander"]=Pokemon()
dict1["Charmander"].var1="Ember Attack"

dict1.sync()

print dict1["Charmander"].var1

dict1.close()

L'unica differenza è che ho fatto dict1 un ripiano dizionario invece di un normale dizionario. Probabilmente ha a che fare con la portata di memoria o qualcosa del genere. In ogni caso, qualcuno può aiutarmi mi rivedo il mio codice in modo che che possa funzionare con scaffali? Grazie!

È stato utile?

Soluzione

dict1=shelve.open("shelve.dat", writeback=True)

è possibile anche specificare il protocollo che dovrebbe migliorare le prestazioni

dict1=shelve.open("shelve.dat", protocol=2, writeback=True)
  

A causa della semantica Python, uno scaffale   non può sapere quando un mutabile   ingresso persistente-dizionario è   modificata. Con oggetti predefiniti modificati   sono scritti solo quando assegnato alla   scaffale (vedi esempio). Se l'optional   parametro di ripresa di valore è impostato su True,   tutte le voci consultati vengono memorizzati nella cache anche   nella memoria, e scritto di nuovo in sync ()   e vicino (); questo può rendere più maneggevole   di mutare le voci mutevoli nel   dizionario persistente, ma, se molti   le voci sono accessibili, si può consumare   grandi quantità di memoria per la cache,   e può rendere l'operazione di chiusura   molto lento dal momento che tutte le voci a cui si accede   sono scritti indietro (non v'è alcun modo per   determinare quali voci sono accessibili   mutevoli, né quali erano effettivamente   mutato).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top