object data member dumper?
George Sakkis
george.sakkis at gmail.com
Tue Dec 12 10:52:03 EST 2006
tom arnall wrote:
> >object data member dumper?
> >George Sakkis george.sakkis at gmail.com
> >Wed Nov 8 03:42:47 CET 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
> >
>
>
> George,
>
> did you ever put up your object dumper on the net?
Here it is: http://rafb.net/paste/results/C0NHBp27.html
Mostly undocumented but works for most common types. Most methods are
overridable so you can customize the dumping for a specific type (or
types) in a subclass.
George
More information about the Python-list
mailing list