gpt4 book ai didi

python - 确定性 key 序列化

转载 作者:太空狗 更新时间:2023-10-30 02:35:25 26 4
gpt4 key购买 nike

我正在编写一个持久保存到磁盘的映射类。我目前只允许 str键,但如果我可以使用更多类型会很好:希望最多可以是任何可散列的(即与内置 dict 相同的要求),但更合理的是我会接受字符串、unicode、int 和元组这些类型。

为此,我想推导出一个确定性的序列化方案。

选项 1 - 挑选 key

我的第一个想法是使用 pickle(或 cPickle)模块序列化 key ,但我注意到 pickle 的输出和 cPickle彼此不匹配:

>>> import pickle
>>> import cPickle
>>> def dumps(x):
... print repr(pickle.dumps(x))
... print repr(cPickle.dumps(x))
...
>>> dumps(1)
'I1\n.'
'I1\n.'
>>> dumps('hello')
"S'hello'\np0\n."
"S'hello'\np1\n."
>>> dumps((1, 2, 'hello'))
"(I1\nI2\nS'hello'\np0\ntp1\n."
"(I1\nI2\nS'hello'\np1\ntp2\n."

有没有pickle的实现/协议(protocol)组合?这对于某些类型集是确定性的(例如,只能将 cPickle 与协议(protocol) 0 一起使用)?

选项 2 - Repr 和 ast.literal_eval

另一种选择是使用 repr转储和ast.literal_eval载入。我写了一个函数来确定给定的 key 是否会在这个过程中存活下来(它在它允许的类型上相当保守):

def is_reprable_key(key):
return type(key) in (int, str, unicode) or (type(key) == tuple and all(
is_reprable_key(x) for x in key))

这个方法的问题是如果repr本身对于我在这里允许的类型是确定性的。我相信由于 str/unicode 文字的变化,这不会在 2/3 版本障碍中幸存下来。这也不适用于 2**32 - 1 < x < 2**64 的整数。在 32 位和 64 位平台之间跳转。是否有任何其他条件(即字符串在同一解释器的不同条件下序列化是否不同)? 编辑:我只是想了解它崩溃的条件,不一定要克服它们。

选项 3:自定义 repr

另一个可能矫枉过正的选择是编写我自己的 repr这使我知道(或怀疑可能是)问题的 repr 的事情变平了。我刚刚在这里写了一个例子:http://gist.github.com/423945

(如果这一切都惨遭失败,那么我可以将键的散列与键和值的 pickle 一起存储,然后遍历具有匹配散列的行,寻找可以解开到预期键的行,但是确实会使其他一些事情复杂化,我宁愿不这样做。编辑: it turns out 内置 hash 也不是跨平台的确定性。从头开始。)

有什么见解吗?

最佳答案

重要说明:如果字典或集合类型嵌入到您尝试序列化的对象中,则 repr() 不是确定性的。 key 可以按任何顺序打印。

例如 print repr({'a':1, 'b':2}) 可能打印出 {'a':1, 'b':2}{'b':2, 'a':1},取决于 Python 决定如何管理字典中的键。

关于python - 确定性 key 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2966684/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com