[Zope-dev] Pickling Error and Method Delegation
Kapil Thangavelu
kvthan@wm.edu
Tue, 11 Jul 2000 05:07:27 -0700
What I am trying to do:
I am developing a python product that is has several composed 'helper'
classes. I am trying to setup a method delegation service to have
certain methods of the helper classes called directly on the container.
the helper methods are defined in a text list called external_api of the
helper classes.
The Problem:
The code below works fine if i call it after the object is already in
the zodb. I can call methods of the helper classes through the
container. if however i try to put the method in the containers __init__
method i get an error back from zope about a pickle error. traceback
below. If i remove this method from __init__ everything works fine
again.
Question:
Whats going on? help...
Platform: Linux 2.2.16
Zope 2.1.6
Code
*** the try/except is only so the method doesn't barf on helper classes
that
don't define an external api, there is no hidden error.
def setup_user_object(self):
""" setup external api to be called on object """
# setups a method delegation service for the external api
# not the most elegant but the one that worked first
global AuthenticationManager, SessionManager, UserPreferences,
UserInfo
user_class_map = ( (SessionManager, "self.sm."), )
for user_class, user_obj_string in user_class_map:
try:
for method in user_class.external_api:
for key, item in user_class.__dict__.items():
if key == method and type(item) ==
types.FunctionType:
self.__dict__[key]=eval(user_obj_string+key)
except:
pass
return self.__dict__.keys()
Traceback
Error Type: UnpickleableError
Error Value: Cannot pickle objects
Traceback (innermost last):
File /home/ender/Zope-2.1.6-src/lib/python/ZPublisher/Publish.py, line
214, in publish_module
File /home/ender/Zope-2.1.6-src/lib/python/ZPublisher/Publish.py, line
179, in publish
File /home/ender/Zope-2.1.6-src/lib/python/Zope/__init__.py, line 202,
in zpublisher_exception_hook
File /home/ender/Zope-2.1.6-src/lib/python/ZPublisher/Publish.py, line
169, in publish
File /home/ender/Zope-2.1.6-src/lib/python/ZODB/Transaction.py, line
237, in commit
File /home/ender/Zope-2.1.6-src/lib/python/ZODB/Connection.py, line
325, in commit
(Info: (('Products.SIN.UserObject', 'UserObject'),
'\000\000\000\000\000\000\001]', ''))
UnpickleableError: (see above)