object data member dumper?

George Sakkis george.sakkis at gmail.com
Tue Nov 7 21:42:47 EST 2006


tom arnall wrote:

> Bruno Desthuilliers wrote:
>
> > tom arnall a écrit :
> >> does anyone know of a utility to do a recursive dump of object data
> >> members?
> >>
> >
> > What are "object data members" ? (hint: in Python, everything is an
> > object - even functions and methods).
> >
> > What is your real use case ?
>
> something like:
>
>    class A:
>       def __init__(self, p1):
>          self.p1 = p1
>
>    class B:
>       def __init__(self,p1, p2):
>          self.a = A(p1)
>          self.p2 = p2
>          self.v1 = '3'
>
>    class C:
>       def __init__(self):
>          self.b = B(3,4)
>          self.p3 = 5
>
>    class D:
>       def __init__(self):
>          self.v2=2
>          self.o1 = C()
>          self.o2 = B(11,12)
>
>
>    d = D()
>    objectDataDumper(d)
>
>
> would produce something like:
>
>    object of class D with:
>    o1(C)->b(B)->a(A)->p1=3
>    o1(C)->b(B)->p2=4
>    o1(C)->b(B)->v1=3
>    o1(C)->p3=5
>    o2(B)->a(A)->p1=11
>    o2(B)->p2=12
>    o2(B)->v1=3
>    v2=2
>
>
> tom arnall
> north spit, ca
> usa

At first I thought pickle would be what you're looking for, because
that's exactly what it does; it dumps arbitrary objects, without
choking on recursive references. Only problem is, it's not human
readable (even in its ascii form).If you want it to be human readable,
you may check the gnosis.xml.pickle module
(http://cheeseshop.python.org/pypi/Gnosis_Utils/1.2.1-a). That's the
output of gnosis.xml.pickle.XML_Pickler(d).dumps() on your example:

<?xml version="1.0"?>
<!DOCTYPE PyObject SYSTEM "PyObjects.dtd">
<PyObject module="__main__" class="D" id="-1210610740">
<attr name="v2" type="numeric" value="2" />
<attr name="o2" type="PyObject" id="-1211043316" module="__main__"
class="B">
  <attr name="a" type="PyObject" id="-1211043220" module="__main__"
class="A">
    <attr name="p1" type="numeric" value="11" />
  </attr>
  <attr name="p2" type="numeric" value="12" />
  <attr name="v1" type="string" value="3" />
</attr>
<attr name="o1" type="PyObject" id="-1211199412" module="__main__"
class="C">
  <attr name="p3" type="numeric" value="5" />
  <attr name="b" type="PyObject" id="-1211082644" module="__main__"
class="B">
    <attr name="a" type="PyObject" id="-1211067156" module="__main__"
class="A">
     <attr name="p1" type="numeric" value="3" />
    </attr>
    <attr name="p2" type="numeric" value="4" />
    <attr name="v1" type="string" value="3" />
  </attr>
</attr>
</PyObject>


I've also written a similar but less verbose xml dumper. The gnosis.xml
package provides a bidirectional mapping between objects and xml
(objects -> xml and xml->object) and therefore has to be precise; mine
simply generates a nice xml dump of the object which isn't necessarily
reversible. Here's the output for your example:

<root type="__main__.D">
  <o1 type="__main__.C">
    <b type="__main__.B">
      <a type="__main__.A">
	<p1 type="int">3</p1>
      </a>
      <p2 type="int">4</p2>
      <v1 type="str">3</v1>
    </b>
    <p3 type="int">5</p3>
  </o1>
  <o2 type="__main__.B">
    <a type="__main__.A">
      <p1 type="int">11</p1>
    </a>
    <p2 type="int">12</p2>
    <v1 type="str">3</v1>
  </o2>
  <v2 type="int">2</v2>
</root>


If you find it suits you better, I'll try to make it available
somewhere (probably in the cookbook).

George




More information about the Python-list mailing list