Pregunta

En este ejemplo, tengo un diccionario, que cuando llamo en él, se muestra "Ember Ataque".

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

Sin embargo, cuando comienzo a utilizar estantes en lugar del diccionario, aparece un espacio en blanco cuando llamo en 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()

La única diferencia es que hice dict1 una estantería diccionario en lugar de un diccionario tradicional. Probablemente tiene que ver con el alcance de memoria o algo así. De todos modos, ¿Puede alguien ayudarme revisar mi código para que se trabajará con los estantes? Gracias!

¿Fue útil?

Solución

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

También puede especificar el protocolo que debería mejorar el rendimiento

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

Debido a la semántica de Python, un estante   no se puede saber cuando un mutable   entrada-diccionario es persistente   modificado. Por objetos modificada por defecto   están escritos sólo cuando asignado a la   estante (véase el ejemplo). Si el opcional   reescritura parámetro se establece en True,   todas las entradas que se accede también se almacenan en caché   en la memoria, y escrito de nuevo en sincronización ()   y cerca(); esto puede hacer que sea más práctico   a mutar entradas mutables en el   persistente diccionario, pero, si muchos   Se accede a las entradas, que puede consumir   vastas cantidades de memoria para la memoria caché,   y puede hacer que la operación de cierre   muy lento ya que todas las entradas que se accede   se escribe de nuevo (no hay manera de   determinan qué entradas son accedidos   mutables, ni cuáles eran en realidad   mutado).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top