Yarin
Yarin

Reputation: 183549

Python pprint issues

I'm using the User object from the Google App Engine environment, and just tried the following:

pprint(user)
print vars(user)

The results:

pprint(user)

users.User(email='[email protected]',_user_id='18580000000000')

print vars(user)

{'_User__federated_identity': None, '_User__auth_domain': 'gmail.com',
'_User__email': '[email protected]', '_User__user_id': '1858000000000',
'_User__federated_provider': None}

Several issues here (sorry for the multipart):

  1. How come I'm not seeing all the variables in my object. It's not showing auth_domain, which has a value?
  2. Is there a way to have it list properties that are = None? None is a legitimate value, why does it treat those properties like they don't exist?
  3. Is there a way to get pprint to line-break between properties?

Upvotes: 1

Views: 4636

Answers (3)

Chris Johnson
Chris Johnson

Reputation: 21956

There are a couple ways to get different line breaks in an object print-dump of this kind.

Sample data:

d = dict(a=1, b=2, c=dict(d=3, e=[4, 5, 6], f=dict(g=7)), h=[8,9,10])

Standard print with no friendly spacing:

>>> print d
{'a': 1, 'h': [8, 9, 10], 'c': {'e': [4, 5, 6], 'd': 3, 'f': {'g': 7}}, 'b': 2}

Two possible solutions:

(1) Using pprint with width=1 gives you one leaf node per line, but possibly >1 keys per line:

>>> import pprint
>>> pprint.pprint(d, width=1)
{'a': 1,
 'b': 2,
 'c': {'d': 3,
       'e': [4,
             5,
             6],
       'f': {'g': 7}},
 'h': [8,
       9,
       10]}

(2) Using json.dumps gives you max one key per line, but some lines with just a closing bracket:

>>> import json
>>> print json.dumps(d, indent=4)
{
    "a": 1, 
    "h": [
        8, 
        9, 
        10
    ], 
    "c": {
        "e": [
            4, 
            5, 
            6
        ], 
        "d": 3, 
        "f": {
            "g": 7
        }
    }, 
    "b": 2
}

Upvotes: 3

ca2longoria
ca2longoria

Reputation: 372

In reference to question 3, "Is there a way to get pprint to line-break between properties?":

The Python Docs make this description:

The formatted representation keeps objects on a single line if it can, and breaks them onto multiple lines if they don’t fit within the allowed width.

The property "width" (passable in init) is where you specify what is allowable. I set mine to width=1, and that seems to do the trick.

As an example:

pretty = pprint.PrettyPrinter(indent=2)

results in...

{ 'acbdf': { 'abdf': { 'c': { }}, 'cbdf': { 'bdf': { 'c': { }}, 'cbd': { }}},
  'cef': { 'abd': { }}}

whereas

pretty = pprint.PrettyPrinter(indent=2,width=1)

results in...

{ 'acbdf': { 'abdf': { 'c': { }},
             'cbdf': { 'bdf': { 'c': { }},
                       'cbd': { }}},
  'cef': { 'abd': { }}}

Hope that helps.

Upvotes: 1

dcrosta
dcrosta

Reputation: 26258

pprint is printing the repr of the instance, while vars simply returns the instance's __dict__, whose repr is then printed. Here's an example:

>>> class Foo(object):
...     def __init__(self, a, b):
...             self.a = a
...             self.b = b
...     def __repr__(self):
...             return 'Foo(a=%s)' % self.a
...
>>> f = Foo(a=1, b=2)
>>> vars(f)
{'a': 1, 'b': 2}
>>> pprint.pprint(f)
Foo(a=1)
>>> vars(f) is f.__dict__
True

You see that the special method __repr__ here (called by pprint(), the print statement, repr(), and others) explicitly only includes the a member, while the instance's __dict__ contains both a and b, and is reflected by the dictionary returned by vars().

Upvotes: 5

Related Questions