[Zope] Storing callable references in the ZODB
Terry Hancock
hancock at anansispaceworks.com
Tue Nov 2 01:39:40 EST 2004
I recently discovered that the ZODB (possibly newly, or
maybe I just haven't noticed this problem before) will not
allow a persistent instance to have an attribute assigned
to it which is a function or a method.
In other words, the following is not allowed:
class MyZopeObj(Persistent,...):
def __init__(self, callme=None):
self.func = callme
although you can do this:
class MyZopeObj(Persistent,...):
callme = ...
(e.g. archived message
http://gossamer-threads.com/lists/zope/users/168215 )
I have a situation in which I need to find a way to
reference a callable object (doesn't strictly have to
be a method/function, but I do want to call it), and
I'm having a little difficulty getting it to fail for
me so that I can test some workaround ideas I have.
Here's what I'm doing so far. I'm using Python 2.3.4
and Zope 2.7.0:
import Zope
Zope.configure('/location/of/zope.conf')
app = Zope.app()
app.objectIds()
# This displays the contents of my root folder in my
# local Zope instance. So far so good.
# make a sandbox folder to play with
app.manage_addFolder('test_perscall')
f = app.test_perscall
# define a function to evilly reference from ZODB:
def spam(a):
return a
# OK, why doesn't *this* fail?
f.spam = spam
#(Surely this is storing the function
# reference in the ZODB?)
# Maybe I need to specifically init this reference in
# a persistent object? Let's try that . . .
from Persistence import Persistent
from OFS import Folder
class WCall(Persistent, Folder):
"""
Test object to hold a method in it's instance.
"""
def __init__(self, id, title=''):
self.id = id
self.title = title
self.spam = spam
ob = WCall('wcall', 'Test callable object instance method')
f._setOb('wcall', ob)
# WHAT?! *Still* no failure?
I figure I must need to get a ZODB commit to happen or
something to make my "unpickleable" error come up, but
how do I make that happen from the Python interpreter
command line?
Any comments would be much appreciated. What I need to
do is get the error to come up reliably so that I know
I understand its limits, and then I need to test my
workaround (which is to trace the function's module
and name, store the result in a persistent callable
object wrapper which can retrieve the function and
call it at need). And of course, I have to make it work
without error for my workaround code.
TIA & Cheers,
Terry
--
Terry Hancock ( hancock at anansispaceworks.com )
Anansi Spaceworks http://www.anansispaceworks.com
More information about the Zope
mailing list