Hi Jean-Paul,
Here is a sample server and client code that demonstrates the problem
with PB's unserialization code and objects that use __slots__. The
SlotsObject class implements __slots__ and the NoSlotsObject does not.
The problem arises when de-serializing the SlotsObject. The stack trace
is a little different than the original one I posted but the net-effect
is the same; an AttributeError exception.
Thanks,
-ben
sample.py (server and copyable objects):
"""
import sys
import os
from twisted.spread import pb
from twisted.internet import reactor
class BaseObject(object, pb.Copyable, pb.RemoteCopy):
def __init__(self, name):
self.name = name
self.version = "1"
self.release = "2"
def __str__(self):
return "%s-%s-%s" % (self.name, self.version, self.release)
class SlotsObject(BaseObject):
"""
Some object that implements __slots__
"""
__slots__ = ["name", "version", "release"]
def __init__(self):
super(SlotsObject, self).__init__("slots")
class NoSlotsObject(BaseObject):
def __init__(self):
super(NoSlotsObject, self).__init__("no-slots")
class SampleServer(pb.Root, object):
"""
Serve up some objects that implement __slots__.
"""
def remote_getSlotsObject(self):
return SlotsObject()
def remote_getNoSlotsObject(self):
return NoSlotsObject()
def main():
reactor.listenTCP(12346, pb.PBServerFactory(SampleServer()))
reactor.run()
if __name__ == "__main__":
from sample import SlotsObject, NoSlotsObject
main()
"""
sample client code:
"""
import sys
import os
from twisted.internet import reactor
from twisted.spread import pb
from twisted.python import util
from sample import SlotsObject, NoSlotsObject
pb.setUnjellyableForClass(SlotsObject, SlotsObject)
pb.setUnjellyableForClass(NoSlotsObject, NoSlotsObject)
def call(factory, name):
remote = factory.getRootObject()
remote.addCallback(lambda obj: obj.callRemote(name))
remote.addCallback(lambda obj: util.println("name is %r" % obj.name))
remote.addErrback(lambda err: err.printTraceback())
return remote
factory = pb.PBClientFactory()
reactor.connectTCP("localhost", 12346, factory)
call(factory, "getSlotsObject")
remote = call(factory, "getNoSlotsObject")
remote.addCallback(lambda _: reactor.stop())
reactor.run()
"""
Output:
"""
Traceback (most recent call last):
File "/usr/lib64/python2.5/site-packages/twisted/internet/defer.py", line
304, in _startRunCallbacks
self._runCallbacks()
File "/usr/lib64/python2.5/site-packages/twisted/internet/defer.py", line
317, in _runCallbacks
self.result = callback(self.result, *args, **kw)
File "/usr/lib64/python2.5/site-packages/twisted/internet/defer.py", line
281, in _continue
self.unpause()
File "/usr/lib64/python2.5/site-packages/twisted/internet/defer.py", line
277, in unpause
self._runCallbacks()
--- <exception caught here> ---
File "/usr/lib64/python2.5/site-packages/twisted/internet/defer.py", line
317, in _runCallbacks
self.result = callback(self.result, *args, **kw)
File "./sample-client.py", line 17, in <lambda>
remote.addCallback(lambda obj: util.println("name is %r" % obj.name))
exceptions.AttributeError: name
name is 'no-slots'
"""
On Wed, Sep 23, 2009 at 09:42:26PM -0000, [email protected] wrote:
> On 07:06 pm, [email protected] wrote:
> >Hi,
> >
> >I am trying to send new style classes that implement __slots__ with
> >spread.pb.
> >Things seem to go awry when attempting to un-serialize the objects on
> >the
> >client side. I am not sure if this is a known issue. How can I work
> >around
> >this issue?
>
> Perhaps the presence of __slots__ breaks PB's unserialization code. Can
> you share a SSCCE (<http://sscce.org/>)? Then perhaps it may make sense
> to file an enhancement ticket to support this case.
>
> Jean-Paul
>
> _______________________________________________
> Twisted-Python mailing list
> [email protected]
> http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
Intelerad Medical Systems
Central Station
895, de la Gauchetiere W., Suite 400
Montreal, QC Canada H3B 4G1
www.intelerad.com
This email or any attachments may contain confidential or legally privileged
information intended for the sole use of the addressees. Any use,
redistribution, disclosure, or reproduction of this information, except as
intended, is prohibited. If you received this email in error, please notify the
sender and remove all copies of the message, including any attachments.
_______________________________________________
Twisted-Python mailing list
[email protected]
http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python