object data member dumper?

tom arnall kloro2006 at gmail.com
Tue Dec 12 13:07:49 EST 2006


George Sakkis wrote:

> 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.
> 


Superb! Thanks very much.

tom arnall
north spit, ca
usa



Make cyberspace pretty: stamp out curly brackets and semicolons.

Loosen up: the tests extend the compiler.


-- 
Posted via a free Usenet account from http://www.teranews.com




More information about the Python-list mailing list