Pergunta

Para este exemplo, eu tenho um dicionário, que quando eu chamar ele, "Um Ataque" é exibida.

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

No entanto, quando eu começar a utilizar prateleiras em vez de o dicionário, fico em branco quando eu chamo na 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()

A única diferença é que eu fiz dict1 uma prateleira dicionário em vez de um dicionário regular.Ele provavelmente tem a ver com a memória escopo ou algo assim.De qualquer maneira, alguém pode me ajudar a rever o meu código para que ele funcione com prateleiras?Obrigado!

Foi útil?

Solução

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

você também pode especificar o protocolo que deve melhorar o desempenho

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

Devido Python semântica, uma prateleira não é possível saber quando um mutável persistente-entrada de dicionário é modificada.Por padrão, os objetos modificados são escritas apenas quando atribuídos ao prateleira (ver Exemplo).Se o opcional escrita parâmetro é definido como True, todas as entradas acessado também são armazenados em cache na memória, e gravados de volta no sync() e close();isso pode torná-lo mais acessíveis para mutação mutável entradas no persistente dicionário, mas, se muitos as entradas são acessados, podem consumir grandes quantidades de memória para o cache, e ele pode fazer a operação de fechamento muito lento, pois todos os acessado entradas são escritas de volta (não há nenhuma maneira para determinar quais entradas são acessados mutável, nem quais foram realmente mutantes).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top