Represent object type as

J

Jason

Hi,

I want to send objects (new style) over DBUS. DBUS can only send
fairly primitive types[1] so I turn my objects into dicts and send
that. I'm reusing the __getstate__ function I wrote for pickling like
so:

def __getstate__(self):
attrs = self.__dict__.copy()
return attrs

....which is perfectly adequate to dict-ify and reconstitute this
simple class. That works just fine over DBUS.

The trouble is, the object could actually be of some slightly
different types, so I'd like to include that information as well. I
tried something like:

def __getstate__(self):
attrs = self.__dict__.copy()
attrs.update({'type': type(self)})
return attrs

....but then realised that "type" is not primitive enough for DBUS to
pickle.

So, (a) can I get the type name from the type object, or (b) is there
a better way to do this?

(This pertains to Python 2.5.4.)

Cheers,
— Jason

[1] http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html#data-types
 
B

Bruno Desthuilliers

Jason a écrit :
Hi,

I want to send objects (new style) over DBUS. DBUS can only send
fairly primitive types[1] so I turn my objects into dicts and send
that. I'm reusing the __getstate__ function I wrote for pickling like
so:

def __getstate__(self):
attrs = self.__dict__.copy()
return attrs

...which is perfectly adequate to dict-ify and reconstitute this
simple class. That works just fine over DBUS.

The trouble is, the object could actually be of some slightly
different types, so I'd like to include that information as well. I
tried something like:

def __getstate__(self):
attrs = self.__dict__.copy()
attrs.update({'type': type(self)})

attrs['type'] = type(self)

Do the same thing with less work !-)

Also and while we're at it, using a __magicname__ convention here (ie :
'__type__' instead of 'type') might avoid possible collisions.
return attrs

...but then realised that "type" is not primitive enough for DBUS to
pickle.

So, (a) can I get the type name from the type object,

attrs['__typename__'] = type(self).__name__


Warning: won't be very useful if your code still uses old-style classes.
or (b) is there
a better way to do this?

Depends on what you do with this dict, DBUS etc. And of your definition
of "better", of course.


HTH
 
J

Jason

           attrs['type'] = type(self)

Do the same thing with less work !-)

Ah, silly me :p
     attrs['__typename__'] = type(self).__name__

That's exactly what I needed — I was not aware of the "__name__"
attribute.
Warning: won't be very useful if your code still uses old-style classes.

No, all the objects are new-style classes so that's fine.
Depends on what you do with this dict, DBUS etc. And of your definition
of "better", of course.

Simplest possible :p But this looks like it, so thanks very much :)

Cheers,
Jason
 
G

Gregory Ewing

Jason said:
I'm reusing the __getstate__ function I wrote for pickling like
so:

Instead of reinventing part of pickle, is there some reason
you couldn't just use it?
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,770
Messages
2,569,585
Members
45,081
Latest member
AnyaMerry

Latest Threads

Top