gpt4 book ai didi

python - 为什么我不能 pickle 这个对象?

转载 作者:太空狗 更新时间:2023-10-29 17:09:53 26 4
gpt4 key购买 nike

我有一个类(下):

class InstrumentChange(object):
'''This class acts as the DTO object to send instrument change information from the
client to the server. See InstrumentChangeTransport below
'''
def __init__(self, **kwargs):
self.kwargs = kwargs
self._changed = None

def _method_name(self, text):
return text.replace(' ','_').lower()

def _what_changed(self):
''' Denotes the column that changed on the instrument returning the column_name of what changed.'''
if not self._changed:
self._changed = self._method_name(self.kwargs.pop('What Changed'))

return self._changed

def __getattr__(self, attr):
for key in self.kwargs.iterkeys():
if self._method_name(key) == attr:
return self.kwargs[key]

def __str__(self):
return "Instrument:%s" % self.kwargs

__repr__ = __str__

what_changed = property(_what_changed)

当我运行以下测试时:

def test_that_instrumentchangetransport_is_picklable(self):
test_dict = {'Updated': 'PAllum', 'Description': 'BR/EUR/BRAZIL/11%/26/06/2017/BD',
'Ask Q': 500, 'Bbg': 'On', 'C Bid': 72.0, 'Benchmark': 'NL/USD/KKB/7.000%/03/11/2009/BD',
'ISIN': 'XS0077157575', 'Bid YTM': 0.0, 'Bid Q': 100, 'C Ask': 72.25, 'Ask YTM': 0.0, 'Bid ASW': 0.0,
'Position': 1280000, 'What Changed': 'C Bid', 'Ask ASW': 0.0}
ins_change = InstrumentChangeTransport(**test_dict)
assert isinstance(ins_change, InstrumentChangeTransport)

# Create a mock filesystem object
file = open('testpickle.dat', 'w')
file = Mock()
pickle.dump(ins_change, file)

我得到:

Traceback (most recent call last):
File "c:\python23\lib\site-packages\nose-0.11.0-py2.3.egg\nose\case.py", line 183, in runTest
self.test(*self.arg)
File "C:\Code\branches\demo\tests\test_framework.py", line 142, in test_that_instrumentchangetransport_is_picklable
pickle.dump(ins_change, file)
File "C:\Python23\Lib\copy_reg.py", line 83, in _reduce_ex
dict = getstate()
TypeError: 'NoneType' object is not callable

我看过 pickle 文档,但我不太明白。

有什么想法吗?

最佳答案

您的代码有几个小的“副作用”问题:在测试中使用的类名中突然出现“传输”(这不是您定义的类名),对内置标识符的可疑践踏file 作为一个局部变量(不要那样做——它在这里没有坏处,但是践踏内置标识符的习惯总有一天会导致神秘的错误),Mock 已经注意到,默认使用最慢、最垃圾的 pickling 协议(protocol)和文本而不是 pickle 文件的二进制文件。

然而,正如@coonj 所说,其核心是缺乏状态控制。 “普通”类不需要它(因为 self.__dict__ 在缺少状态控制且没有其他特性的类中默认被 pickled 和 unpickled)——但是因为你重写了 __getattr__ 不适用于您的类(class)。您只需要另外两个非常简单的方法:

def __getstate__(self): return self.__dict__
def __setstate__(self, d): self.__dict__.update(d)

这基本上告诉 pickle 像对待普通类一样对待你的类,将 self.__dict__ 视为代表整个实例状态,尽管存在 __getattr__

关于python - 为什么我不能 pickle 这个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2049849/

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