Python 使用_setitem在嵌套字典中设置项__
下面是我所做的,尝试为类似dict的数据库创建包装器,以及其他功能:Python 使用_setitem在嵌套字典中设置项__,python,wrapper,Python,Wrapper,下面是我所做的,尝试为类似dict的数据库创建包装器,以及其他功能: class database(object): def __init__(self, name): self.name = name self.db = anydbm.open(name, 'c') def __getitem__(self, key): key = str(key) try
class database(object):
def __init__(self, name):
self.name = name
self.db = anydbm.open(name, 'c')
def __getitem__(self, key):
key = str(key)
try:
self.db = anydbm.open(self.name, 'w')
except Exception,e:
raise e
else:
return cPickle.loads(self.db[key])
finally:
self.db.close()
def __setitem__(self, key, value):
key = str(key)
value = cPickle.dumps(value)
try:
self.db = anydbm.open(self.name, 'w')
except Exception,e:
print e
else:
self.db[key] = value
finally:
self.db.close()
当我试图在嵌套在中的dict中定义一个新键时,似乎getitem返回的是一个值而不是一个引用,因此定义不会在setitem之后最终修改
>>> from database import database
>>> db = database('test')
>>> db['a'] = {'alpha':'aaa'}
>>> db['a']['alpha'] = 'bbb'
>>> print db
{'a': {'alpha': 'aaa'}} //The value is not modified
好吧,你必须明白你在做什么:
db['a'] = {'alpha':'aaa'}
相当于
db.__setitem__('a', {'alpha':'aaa'})
因此,这会将dict转储到磁盘。然而当你这样做的时候
db['a']['alpha'] = 'bbb'
您首先从磁盘加载dict
tmp = db.__getitem__('a') # except tmp is pushed on the stack
然后更改此命令:
tmp['alpha'] = 'bbb'
这显然对转储到磁盘的数据没有影响,因为对象不再涉及
要实现这一点,您不能返回一个简单的dict,而是需要另一个对象来跟踪更改并将其写回磁盘
顺便说一句,你在写作。它也有同样的问题:
由于Python语义的原因,工具架无法知道何时
永久字典条目已修改。默认情况下,修改的对象
仅当指定给工具架时才写入(请参见示例)。如果
可选写回参数设置为True,则访问所有条目
也缓存在内存中,并在sync()和close()上写回;这
可以更方便地在持久性数据库中变异可变条目
但是,如果访问了许多条目,它可能会消耗大量资源
缓存的内存量,它可以执行关闭操作
非常慢,因为所有访问的条目都被写回(没有办法
确定哪些访问的条目是可变的,哪些是可变的
实际上发生了变异)
我不知道这个问题的标题是否正确。请随意编辑您认为最好的内容。