0

この例では、辞書を呼び出したときに「Ember Attack」と表示される辞書があります。

#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 を通常の辞書ではなく保留辞書にしたことです。おそらくメモリスコープか何かに関係しています。とにかく、シェルフで動作するようにコードを修正するのを手伝ってくれる人はいますか? ありがとう!

4

1 に答える 1

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

パフォーマンスを向上させるプロトコルを指定することもできます

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

Python のセマンティクスのため、シェルフは変更可能な永続辞書エントリがいつ変更されたかを知ることができません。デフォルトでは、変更されたオブジェクトは、シェルフに割り当てられた場合にのみ書き込まれます (例を参照)。オプションの writeback パラメータが True に設定されている場合、アクセスされたすべてのエントリもメモリにキャッシュされ、sync() および close() で書き戻されます。これにより、永続的なディクショナリ内の変更可能なエントリを簡単に変更できますが、多くのエントリがアクセスされると、キャッシュに大量のメモリが消費される可能性があり、アクセスされたすべてのエントリが書き戻されるため、閉じる操作が非常に遅くなる可能性があります (アクセスされたエントリが変更可能であるか、実際に変更されたかを判断する方法はありません)。

于 2010-08-04T22:54:14.033 に答える