3

有据可查的是,Python 的搁置模块要求所有键都是字符串,并且有各种解决方法(请参阅此处此处的线程)。我的问题是,为什么搁置需要字符串键?鉴于我可以腌制一个使用其他对象作为键的字典,并且搁置在引擎盖下使用腌制,为什么搁置本身不能处理这些键?字符串键是否使仅更新持久对象的一部分而不是重写整个对象变得更加简单(如果是,为什么)?

4

2 回答 2

3

因为在底层,搁置模块使用 bsddb、gdbm 或 dbm 之一进行存储,并且它们仅支持字符串键。

你是对的,你可以腌制一个使用其他对象作为键的字典,但是当一个键发生变化时,你必须刷新整个存储。通过使用类似的键值数据库,只有更改的值会被刷新。

于 2013-11-01T20:45:49.303 回答
0

可能有人会发现这个例子很有用

class Data:
    __slots__ = "name", "version"

    def __init__(self, name, version):
        self.name, self.version = name, version

    def __str__(self):
        return f"{self.name}:{self.version}"


    def encode(self, *args):
        s = self.__str__()
        return s.encode(*args)


def _d(s: str) -> Data:
    words = s.split(":")
    return Data(words[0], words[1]) 

import shelve
db = shelve.open("./db", flag="n", writeback=False)
print(Data("1", "2") in db)
for key in db:
    print(f"{_d(key)}")
于 2021-11-30T08:29:56.407 回答