Когда вы соберете объект, который имеет некоторые атрибуты, которые не могут быть маринованными, он потерпит неудачу с общим сообщением об ошибке, например:
PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup __builtin__.instancemethod failed
Можно ли указать, какой атрибут вызвал исключение? Я использую Python 2.5.2.
Несмотря на то, что в принципе я понимаю основную причину проблемы (например, в вышеприведенном примере, имеющем метод экземпляра), все же очень сложно точно точно определить ее. В моем случае я уже определил пользовательский метод __getstate__
, но забыл о критическом атрибуте. Это произошло в сложной структуре вложенных объектов, поэтому мне потребовалось некоторое время, чтобы определить плохой атрибут.
В соответствии с запросом, вот один простой пример: умышленно неудавшийся рассол:
import cPickle as pickle
import new
class Test(object):
pass
def test_func(self):
pass
test = Test()
pickle.dumps(test)
print "now with instancemethod..."
test.test_meth = new.instancemethod(test_func, test)
pickle.dumps(test)
Это вывод:
now with instancemethod...
Traceback (most recent call last):
File "/home/wilbert/develop/workspace/Playground/src/misc/picklefail.py", line 15, in <module>
pickle.dumps(test)
File "/home/wilbert/lib/python2.5/copy_reg.py", line 69, in _reduce_ex
raise TypeError, "can't pickle %s objects" % base.__name__
TypeError: can't pickle instancemethod objects
К сожалению, нет намека на то, что атрибут test_meth
вызывает проблему.