皮克输了我的一个论点

2024-06-28 11:18:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我在pickle上遇到了麻烦:我有一个棘手的用例,而且我不能得到pickle对象的副本。如果我从

class OneArg(object):
    def __init__(self, somearg, *args, **kwargs):
        print "In OneArgs's init with args={} and kwargs={}".format(args, kwargs)
        self._somearg = somearg
        super(OneArg, self).__init__(*args, **kwargs)

class OneArgSubclass(OneArg, OrderedDict):
    def __init__(self, *args, **kwargs):
        print "In OneArgSubclass's init with args={} and kwargs={}".format(args, kwargs)
        super(OneArgSubclass, self).__init__(*args, **kwargs)


def verbose_pickle_dumps (obj):
    result = pickle.dumps(obj)
    print result
    return result


oas = OneArgSubclass("SOMEARG")
oas['spam'] = 'eggs'
oas_red = pickle.loads(verbose_pickle_dumps(oas))
print "oas_red.keys():", oas_red.keys()

以下是我得到的输出:

^{pr2}$

我可以看到,当我pickle oas时,'spam'/'eggs'键/值对在那里,还有_somearg的值。但是请注意,字符串“OrderedDict”不会出现。当我试图从pickle加载回oas时,它没有提取字符串“SOMEARG”,因此字典的内容最终以_SOMEARG的值结束。在

我查过了,oas既没有\uugen getinitargs_u9()也没有u getnewargs_uu()。如果我使用常规dict而不是OrderedDict,那么代码可以正常工作(pickled表示形式看起来非常不同,包括提到“copy_reg”),因此我认为问题可能是pickle和OrderedDict之间的兼容性。但是当我单独处理一个有序的dict时,pickle的工作很好。在


Tags: selfinitdefargsresultpicklekwargsordereddict
2条回答

当您pickle某些内容时,several different methods可用于提取数据以在取消拾取时重新创建对象。您遇到的问题是OrderedDict定义了其中一个(__reduce__),但它返回的结果与您的__init__不兼容,因此您需要自己编写:

def __reduce__(self):
    return (self.__class__, (self._somearg, tuple(self.items())))

您可能想为您的类实现一个__repr__()方法,如下所示:http://bytes.com/topic/python/answers/781057-pickle-instance-custom-class。在

{{{cda}从这个示例中派生出方法

def __repr__(self):
        return '{%s}' % ', '.join([': '.join([repr(k),str(v)]) \
                                   for k,v in zip(self.keys(), self.values())])

当类__init()__站立时

^{pr2}$

相关问题 更多 >