Object "dumping"

Gumuz gumuz at looze.net
Mon Feb 3 03:52:35 EST 2003


oh yeah, now i remember

_that's_ why i don't do perl ;)



"Derek Thomson" <dthomson at users.sf.net> wrote in message
news:3e3dca43$0$9993$afc38c87 at news.optusnet.com.au...
> Hi all,
>
> I'm debugging a particularly nasty problem in a moderately complex bit
> of Python, and I really need something that I can use to just print out
> the state of an object.
>
> I also do a lot of Perl, and that's available in Perl with the
> Data::Dumper module.
>
> 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.
>
> As I like to illustrate my examples, here's a simple class in Python:
>
> #!/usr/bin/env python
>
> class RequestHeader:
>
>      def __init__(self,
>                   _service_context, _request_id, _response_expected,
>                   _object_key, _operation, _requesting_principal):
>
>          self.service_context      = _service_context
>          self.request_id           = _request_id
>          self.response_expected    = _response_expected
>          self.object_key           = _object_key
>          self.operation            = _operation
>          self.requesting_principal = _requesting_principal
>
>          return
>
>      def get_request_id(self):
>          return self.request_id
>
>      # ... other methods ...
>
> Now, if I attempt to use pprint to "dump" the object to a stream as
> follows ...
>
> #!/usr/bin/env python
>
> from requestheader import RequestHeader
> import pprint
>
> rh1 = RequestHeader('some context', 13, 1, 'an object key',
>                      'op1name', 'principal1')
>
> rh2 = RequestHeader('some other context', 14, 2, 'different object key',
>                      'opname2', 'principal2')
>
> rh_list = [ rh1, rh2 ]
>
> pprint.pprint(rh_list)
>
> ... I get:
>
>
> [<requestheader.RequestHeader instance at 0x81150d4>,
>   <requestheader.RequestHeader instance at 0x8127b8c>]
>
> Now, to show you what I actually want, here it is in Perl. First the
> class definition:
>
> #!/usr/bin/env perl
>
> use warnings;
> use strict;
>
> package RequestHeader;
>
> use English;
>
> # (Perl uses packages for class namespaces)
>
> sub new
> {
>      # Get the constructor arguments
>      my ($class,
> $service_context, $request_id, $response_expected,
>          $object_key, $operation, $requesting_principal)    = @ARG;
>
>      # We will represent instances of this class with a hash table
>      my $self = {
> service_context      => $service_context,
> request_id           => $request_id,
> response_expected    => $response_expected,
> object_key           => $object_key,
> operation            => $operation,
> requesting_principal => $requesting_principal };
>
>      # Bless the reference to the hash so that method calls know which
>      # class (or package) this object belongs to
>      bless $self, $class;
>
>      # Return the new object reference
>      return $self;
> }
>
> sub get_request_id
> {
>      my ($self) = @ARG;
>
>      return $self->{request_id};
> }
>
> # ... other methods ...
>
> return 1; # Return module load success
>
> Now, here's the code to "dump" some of those objects ...
>
> #!/usr/bin/env perl
>
> use warnings;
> use strict;
>
> use RequestHeader;
>
> use Data::Dumper;
>
> my $rh1 = RequestHeader->new('some context', 13, 1,
>      'an object key', 'op1name',
>      'principal2');
>
> my $rh2 = RequestHeader->new('some other context', 14, 2,
>      'different object key', 'op2name',
>      'principal2');
>
> my $rh_list = [ $rh1, $rh2 ];
>
> print Dumper($rh_list);
>
> When I run this, I get:
>
> $VAR1 = [
>            bless( {
>                     'requesting_principal' => 'principal2',
>                     'object_key' => 'an object key',
>                     'service_context' => 'some context',
>                     'response_expected' => 1,
>                     'operation' => 'op1name',
>                     'request_id' => 13
>                   }, 'RequestHeader' ),
>            bless( {
>                     'requesting_principal' => 'principal2',
>                     'object_key' => 'different object key',
>                     'service_context' => 'some other context',
>                     'response_expected' => 2,
>                     'operation' => 'op2name',
>                     'request_id' => 14
>                   }, 'RequestHeader' )
>          ];
>
> ... which is what I need for debugging purposes. Now, I know I can add
> methods to the RequestHeader class for printing, but I don't want to do
> that for every single class I want to dump. Now, as I'm constantly
> harping on, the Python and Perl object models are quite similar, so a
> generic "object dumper" should be possible. Does one exist?
>
> Thanks,
> Derek.
>






More information about the Python-list mailing list