[Twisted-Python] Transporting pb.Copyable classes?
exarkun at divmod.com
exarkun at divmod.com
Tue Apr 20 19:06:06 MDT 2004
On Tue, 20 Apr 2004 17:48:00 -0700 (PDT), Jasper Phillips <jasper at peak.org> wrote:
>
> On Wed, 21 Apr 2004, Andrew Bennetts wrote:
>
> > On Tue, Apr 20, 2004 at 04:20:32PM -0700, Jasper Phillips wrote:
> > >
> > > I've been passing around instances of pb.Copyable classes for some time,
> > > registering them via pb.setCopierForClassTree()... However, this doesn't
> > > allow me to pass the classes themselves.
> > >
> > > I dug around in jelly and found jelly.globalSecurity.allowInstancesOf(),
> > > which seems to do what I want, but makes me nervious as it's pretty
> > > buried...
> > >
> > > Passing classes seems like a reasonable thing to do, but now I wonder if
> > > there is some reason that jelly doesn't allow it (except via a buried
> > > method call)? Or is this just an accidental misfeature?
> >
> > Why not just pass the name of the class, and unserialise that as
> > appropriate?
> >
> > I'm not a PB expert (or even close), but I always lean towards passing data
> > rather than code (or code-like things like classes) over remote method calls
> > when I can :)
>
> That's certainly feasible, but then I have an extra unserialize step
> cluttering my code as the classes passed have attributes I want to access.
> In general I'm passing game state which exists naturally as code, and while
> I could always serialize and unserialize it, why bother if I don't have to?
>
> Plus, isn't unserializing classes based upon their name exactly what jelly
> does?
>
> On the other hand it's debateable whether the things I'm passing _should_ be
> classes at all (they represent a type of terrain, with statically accessible
> fields describing their game effects). However, the quality of my code is
> really a seperate issue.
>
Just to be sure I'm reading this correctly, you have something like...
class Foo:
bar = []
Foo.bar.append(baz)
someRemoteRef.callRemote('doStuff', Foo)
where you want 'remote_doStuff' to receive a class object whose "bar" attribute is [baz] (or possibly [RemoteReference(baz)], or *something* containing baz)? If not, disregard the rest of my post :) Otherwise ...
You're going to have difficulty using PB with this approach. PB can serialize classes, but it does so in exactly the way Andrew described: it looks up their name and sends it, and the other side turns the name back into an object. Any mutable class state you change on one side will *not* be reflected on the other side.
I'd recommend moving your mutable state off these class objects and onto instances of some sort. Otherwise, you will have to implement special jelliers/unjelliers for the class objects you want treated specially.
Jp
More information about the Twisted-Python
mailing list