[Zope] "can't pickle instancemethod objects" in testcase

Dieter Maurer dieter at handshake.de
Tue Jan 8 17:10:53 EST 2008

Peter Bengtsson wrote at 2008-1-7 18:29 +0000:
>My code works fine in normal running zope but not when run as a testcase 
>(I'm not using bin/zopectl test if that matters) I get the following error.
>I feel guilty since I've got this line in my code:
>transaction.get().commit()  (Expense.py#4458)
>I remember having come across this error before but can't remember what 
>the solution was.
> ...
>   File "/home/peterbe/zope/zope285/lib/python/ZODB/serialize.py", line 
>339, in _dump
>     self._p.dump(state)
>   File "copy_reg.py", line 69, in _reduce_ex
>     raise TypeError, "can't pickle %s objects" % base.__name__
>TypeError: can't pickle instancemethod objects

Apparently, you have an "instancemethod" in your test setup
where you do not have one in the normal Zope.

An alternative explanation could be that in your normal
Zope additional pickle registrations are performed.
If you would use, e.g., my "CompiledExecutable" product,
then the import of this product would register "code" and "instancemethod"
instances as picklable. A test setup may not import "CompiledExecutables"
and its pickle registrations would be missing.

A side note: Usually, it is a very bad idea to perform a full
"commit" in a test. Such "commit"s are incompatible with
techniques that share (for efficiency reasons) part of the
test setup among several tests. "ZopeTestCase", e.g., makes
use of such techniques.


More information about the Zope mailing list