如何在Python中将磁盘上的JSON文件绑定到进程中的字典?
在Perl语言中,有一个叫做“tie操作符”的概念,意思是当你写入或修改一个变量时,可以执行一些任意的代码(比如更新一个底层的Berkeley数据库文件)。我相信在Python中也有类似的“重载”概念。
我想知道,最自然的方式是什么,能把一个本地的JSON文件当作在Python脚本运行期间所需的层次信息的主要来源,这样在本地字典中的变化就能自动反映到JSON文件里。我会把文件写入和缓存的优化留给操作系统(我不介意在脚本运行过程中这个文件被更新很多次),但最终我只是想保留大约一千字节的元数据。并不需要考虑并发访问的问题。我只想在Python进程中访问一个层次结构(像嵌套字典那样),并且对这个结构的读取和写入能够自动导致对本地JSON文件的读取和修改。
3 个回答
如果不需要同时处理多个任务,或许可以考虑写两个函数,一个用来读取数据,另一个用来把数据写入一个文件?我们的想法是让这个字典能够“感知”到变化,从而在不需要额外操作的情况下自动更新文件吗?
这是对aspect_mkn8rd回答的进一步发展,考虑了Gerrat的评论,但内容太长,不适合放在评论里。
你需要创建两个特殊的容器类,分别模拟一个列表和一个字典。在这两个类中,你需要添加一个指向顶层对象的指针,并重写以下方法:
__setitem__(self, key, value)
__delitem__(self, key)
__reversed__(self)
这些方法在修改数据时会被调用,并且需要将顶层对象写入磁盘。
另外,__setitem__(self, key, value)
方法需要检查传入的值是否是一个列表,如果是,就把它包装成一个特殊的列表对象;如果是字典,则包装成一个特殊的字典对象。在这两种情况下,方法都应该将顶层对象放入新的容器中。如果都不是,并且对象定义了__setitem__
,那么就应该抛出一个异常,说明这个对象不被支持。当然,你还需要修改这个方法,以适应新的类。
当然,这里需要写和测试很多代码,但应该是可行的——留给读者作为练习:-)
好吧,因为Python本身没有信号和槽的机制,所以你可以自己创建一个字典类,继承自Python的字典。这个类和Python的字典完全一样,只是在每个可以改变字典值的方法里,你会把你的数据保存成JSON格式。
另外,你还可以使用类似于PyQt4 QAbstractItemModel的东西,它有信号功能。当数据发生变化时,会发出信号,你就可以在这里保存数据,这样只需要在一个地方处理,挺方便的。
我知道这两种方法可能有点笨,可能是的。:) 如果有人知道更好的方法,欢迎告诉我!