gpt4 book ai didi

python - Pickle序列化顺序之谜

转载 作者:太空宇宙 更新时间:2023-11-04 10:36:30 25 4
gpt4 key购买 nike

2017 年 6 月 8 日更新

虽然三年过去了,我的PR通过强制执行输出顺序作为临时解决方案仍然悬而未决。 Stream-Framework 可能会重新考虑其使用内容作为通知键的设计。 GitHub Issue #153引用这个。

问题

请参阅以下示例:

import pickle
x = {'order_number': 'X', 'deal_url': 'J'}

pickle.dumps(x)
pickle.dumps(pickle.loads(pickle.dumps(x)))
pickle.dumps(pickle.loads(pickle.dumps(pickle.loads(pickle.dumps(x)))))

结果:

(dp0\nS'deal_url'\np1\nS'J'\np2\nsS'order_number'\np3\nS'X'\np4\ns.
(dp0\nS'order_number'\np1\nS'X'\np2\nsS'deal_url'\np3\nS'J'\np4\ns.
(dp0\nS'deal_url'\np1\nS'J'\np2\nsS'order_number'\np3\nS'X'\np4\ns.

很明显,每次转储的序列化输出都会发生变化。当我从任何键中删除一个字符时,都不会发生这种情况。我发现这是 Stream-Framework使用 pickled 输出作为在其 k/v 存储中存储通知的键。如果我们能更好地了解这里发生的事情,我会提出请求。我找到了两种解决方案来防止它:

A - 排序后转换为字典(是的,以某种方式提供了预期的副作用)

import operator
sorted_x = dict(sorted(x.iteritems(), key=operator.itemgetter(1)))

B - 删除下划线(但不确定这是否总是有效)

那么,是什么导致了 pickle 字典排序下的谜团呢?

通过 dict 调用 sort 提供转储以产生相同结果的证明:

import operator
x = dict(sorted(x.iteritems(), key=operator.itemgetter(1)))

pickle.dumps(x)
"(dp0\nS'order_number'\np1\nS'X'\np2\nsS'deal_url'\np3\nS'J'\np4\ns."

x = pickle.loads(pickle.dumps(x))
x = dict(sorted(x.iteritems(), key=operator.itemgetter(1)))

pickle.dumps(x)
"(dp0\nS'order_number'\np1\nS'X'\np2\nsS'deal_url'\np3\nS'J'\np4\ns."

最佳答案

字典是未排序的数据结构。这意味着顺序是任意的,pickle 将按原样存储它们。您可以使用 collections.OrderedDict如果你想使用排序字典。

当你在解释器中玩耍时,你认为你看到的任何命令都只是解释器对你很好。

来自 dict 的文档:

It is best to think of a dictionary as an unordered set of key: value pairs, with the requirement that the keys are unique (within one dictionary)

请记住函数 dict.keys()dict.values()dict.items() 也会返回它们各自的值以任意顺序。

关于python - Pickle序列化顺序之谜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23069908/

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