Вопрос

Для этого примера у меня есть словарь, что когда я звоню на него, отображается «Эмберская атака».

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

Однако, когда я начинаю использовать полки вместо словаря, я получаю бланк, когда я звоню на 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()

Единственное отличие состоит в том, что я сделал Dict1 Shelve словарь вместо обычного словаря. Вероятно, связано с объем памяти или что-то в этом роде. Во всяком случае, может кто-нибудь помочь мне пересмотреть мой код, чтобы он будет работать с полками? Спасибо!

Это было полезно?

Решение

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

Вы также можете указать протокол, который должен улучшить производительность

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

Из-за Semantics Python полка не может знать, когда модифицирована смежная постоянная вход в словарь. По умолчанию модифицированные объекты записываются только при назначении на полку (см. Пример). Если дополнительный параметр обратка установлен на true, все записи доступов также кэшируются в памяти, а затем записаны на синхронизации () и закрыть (); Это может удержать его укором, чтобы мутировать воичные записи в постоянном словаре, но, если доступны во многих записях, он может потреблять огромные объемы памяти для кэша, и он может сделать тесную работу очень медленно, поскольку все доступные доступы записаны ( Нет никакого способа определить, какие доступные записи были измельчены, ни какие из них были фактически мутированы).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top