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

Peter Bengtsson peter at fry-it.com
Sun Jan 13 07:20:23 EST 2008


Thanks Andreas and Dieter,

The explanation was quite simple, I set an attribute on an object that
was a method like this::

class TestBase(ZopeTestCase.ZopeTestCase):

    def dummy_redirect(self, *a, **kw):
        self.has_redirected = a[0]
        if kw:
            print "*** Redirecting to %r + (%s)" % (a[0], kw)
        else:
            print "*** Redirecting to %r" % a[0]

    def afterSetUp(self):
        self._setupDBConnection()
        dispatcher = self.folder.manage_addProduct['MExpenses']
        dispatcher.manage_addHomepage('mexpenses')
        self.mexpenses = self.folder['mexpenses']
        self.mexpenses.http_redirect = self.dummy_redirect # NOTICE!!

        request = self.app.REQUEST
        sdm = self.app.session_data_manager
        request.set('SESSION', sdm.getSessionData())

        self.has_redirected = False


The reason for the dummy redirector is boring. The reason for the
transaction.get().commit() is to not cancel everything when a
ConflicrError happens during a very long-lasting file upload.

Again, thanks.

PS. Andreas, I did use your set_trace() tip on the ZODB code. Isn't
Python great!

On 08/01/2008, Dieter Maurer <dieter at handshake.de> wrote:
> 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.
>
>
>
> --
> Dieter
>


-- 
Peter Bengtsson,
work www.fry-it.com
home www.peterbe.com
hobby www.issuetrackerproduct.com


More information about the Zope mailing list