gpt4 book ai didi

python - Pickle functools 包装器错误 : can't pickle functools. KeyWrapper 对象

转载 作者:行者123 更新时间:2023-12-01 02:20:36 29 4
gpt4 key购买 nike

我正在尝试 pickle 一个 SortedListWithKey,我正在使用 functools 中的 cmp_to_key() 将比较函数转换为键函数。但是, cmp_to_key() 似乎使我的对象不可选取,并且出现以下错误: TypeError: can't pickle functools.KeyWrapper objects

我该如何解决这个问题?这是重现错误的代码示例:

import pickle
from functools import cmp_to_key
from sortedcontainers import SortedListWithKey

def order_fun(a, b):
if abs(a[0]-b[0]) < 1e-8:
return 0
elif a[0]-b[0] > 0:
return 1
else:
return -1

pickle.loads(pickle.dumps(SortedListWithKey([[1,2], [3,4]], key=cmp_to_key(order_fun))))

谢谢!

注意:在不使用 cmp_to_key() 函数的情况下, pickle 工作正常,但我需要它,因为我的函数不是关键函数。

最佳答案

问题似乎是cmp_tp_keynow written in C ,并且它返回的类既不可pickle也不可子类化。然而,原来的纯python版本是still maintained in the source ,而且非常简单。当将此与您的示例一起使用时,它可以正常工作。当然,明显的缺点是纯 python 版本速度较慢 - 但是 the difference is not huge .

这是您的示例的工作版本:

import pickle
from sortedcontainers import SortedListWithKey

def order_fun(a, b):
if abs(a[0]-b[0]) < 1e-8:
return 0
elif a[0]-b[0] > 0:
return 1
else:
return -1

class KeyFunc(object):
__slots__ = ['obj']
def __init__(self, obj):
self.obj = obj
def __lt__(self, other):
return order_fun(self.obj, other.obj) < 0
def __gt__(self, other):
return order_fun(self.obj, other.obj) > 0
def __eq__(self, other):
return order_fun(self.obj, other.obj) == 0
def __le__(self, other):
return order_fun(self.obj, other.obj) <= 0
def __ge__(self, other):
return order_fun(self.obj, other.obj) >= 0
__hash__ = None

sl = SortedListWithKey([[1,2], [3,4]], key=KeyFunc)

print(sl)

print(pickle.loads(pickle.dumps(sl)))

输出:

SortedListWithKey([[1, 2], [3, 4]], key=<class '__main__.KeyFunc'>)
SortedListWithKey([[1, 2], [3, 4]], key=<class '__main__.KeyFunc'>)

关于python - Pickle functools 包装器错误 : can't pickle functools. KeyWrapper 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47985058/

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