Python 使用_setitem在嵌套字典中设置项__

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

下面是我所做的,尝试为类似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:
                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()上写回;这 可以更方便地在持久性数据库中变异可变条目 但是,如果访问了许多条目,它可能会消耗大量资源 缓存的内存量,它可以执行关闭操作 非常慢,因为所有访问的条目都被写回(没有办法 确定哪些访问的条目是可变的,哪些是可变的 实际上发生了变异)


我不知道这个问题的标题是否正确。请随意编辑您认为最好的内容。