Object "dumping"

Andrew Bennetts andrew-pythonlist at puzzling.org
Mon Feb 3 11:02:58 CET 2003


On Mon, Feb 03, 2003 at 07:25:30PM +1000, Derek Thomson wrote:
> Hi Andrew,
> 
> Andrew Bennetts wrote:
> > On Mon, Feb 03, 2003 at 11:47:38AM +1000, Derek Thomson wrote:
> >>
> >>I know Python has pprint, but that stops when it encounters an object
> >>ie. it only dumps sequences and hashes, which is less than what I want.
> >
> >
> > The problem is harder than it seems... simply recursively printing the
> > objects and their contents won't work for cyclic objects, so for many data
> > structures, you *need* something that can cope with this, like pickle.
> 
> No, I'm aware of this issue. Perl's Data::Dumper just deals with it :)

Yes, but I don't know (much) Perl, so I didn't know what it could do, so
saying "I want Data::Dumper for Python" didn't help me much :)

[..snip..]
> > There are other pickle alternatives too, like an XMLPickle, iirc.
> 
> Yes, but I need human readable, not XML! :)
> 
> I guess twisted.spread.jelly is an option, but I'd prefer it if the output
> were just Python - then there's no need to learn a new notation.
> 
> Anyway, thanks heaps.

Well...

There's also twisted.persisted.aot, which does serialise to Python code that
will reconstruct the objects.  But Jelly's notation is really quite
readable:

    >>> from twisted.spread import jelly
    >>> class C:
    ...     pass
    ... 
    >>> class D: 
    ...     pass
    ... 
    >>> c = C()
    >>> c.d = D()
    >>> c.foo = 'bar'
    >>> c.d.baz = 'quux'
    >>> c.x = 1
    >>> jelly.jelly(c)
    ['__main__.C', ['dictionary', ['x', 1], ['foo', 'bar'], ['d', ['__main__.D', ['dictionary', ['baz', 'quux']]]]]]

Ok, that's a bit hard to follow on one line like that... so lets pprint it:

    >>> from pprint import pprint
    >>> pprint(jelly.jelly(c))
    ['__main__.C',
     ['dictionary',
      ['x', 1],
      ['foo', 'bar'],
      ['d', ['__main__.D', ['dictionary', ['baz', 'quux']]]]]]

For comparison, t.p.aot does this:

    >>> from twisted.persisted import aot
    >>> print aot.jellyToSource(c)
    app=Instance('__main__.C',
      d=Instance('__main__.D',
        baz='quux',),
      foo='bar',
      x=1,)

-Andrew.






More information about the Python-list mailing list