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
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
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
Instead of reinventing part of pickle, is there some reason
you couldn't just use it?
--
Greg