This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: pprint doesn't work well for counters, sometimes shows them like a dict
Type: Stage:
Components: Library (Lib) Versions: Python 3.4
process
Status: closed Resolution: duplicate
Dependencies: Superseder: general pprint rewrite
View: 7434
Assigned To: Nosy List: akira, cool-RR, rhettinger
Priority: normal Keywords:

Created on 2014-05-20 15:32 by cool-RR, last changed 2022-04-11 14:58 by admin. This issue is now closed.

Messages (5)
msg218848 - (view) Author: Ram Rachum (cool-RR) * Date: 2014-05-20 15:32
pprint doesn't work well for counters, sometimes shows them like a dict 
    
    Python 3.4.0 (v3.4.0:04f714765c13, Mar 16 2014, 19:25:23) [MSC v.1600 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license" for more information.
    >>> dd={'a': 11640, 'b': 2614, 'c': 5261, 'd': 5311, 'e': 17722, 'f': 3041, 'g': 3570, 'h': 6740, 'i':
     10729, 'j': 279, 'k': 1812, 'l': 6391, 'm': 5037, 'n': 10111, 'o': 11922, 'p': 3863, 'q': 99, 'r': 94
    61, 's': 9444, 't': 13744, 'u': 4027, 'v': 1486, 'w': 3194, 'x': 540, 'y': 2976, 'z': 203}
    >>> import collections
    >>> collections.Counter(dd)
    Counter({'e': 17722, 't': 13744, 'o': 11922, 'a': 11640, 'i': 10729, 'n': 10111, 'r': 9461, 's': 9444,
     'h': 6740, 'l': 6391, 'd': 5311, 'c': 5261, 'm': 5037, 'u': 4027, 'p': 3863, 'g': 3570, 'w': 3194, 'f
    ': 3041, 'y': 2976, 'b': 2614, 'k': 1812, 'v': 1486, 'x': 540, 'j': 279, 'z': 203, 'q': 99})
    >>> import pprint
    >>> pprint.pprint(collections.Counter(dd))
    {'a': 11640,
     'b': 2614,
     'c': 5261,
     'd': 5311,
     'e': 17722,
     'f': 3041,
     'g': 3570,
     'h': 6740,
     'i': 10729,
     'j': 279,
     'k': 1812,
     'l': 6391,
     'm': 5037,
     'n': 10111,
     'o': 11922,
     'p': 3863,
     'q': 99,
     'r': 9461,
     's': 9444,
     't': 13744,
     'u': 4027,
     'v': 1486,
     'w': 3194,
     'x': 540,
     'y': 2976,
     'z': 203}
    >>>
msg218872 - (view) Author: Akira Li (akira) * Date: 2014-05-21 13:26
If it fits on a line then it seems Counter's repr is used:

  >>> pprint(Counter({i:i*i for i in range(10)}))
  Counter({9: 81, 8: 64, 7: 49, 6: 36, 5: 25, 4: 16, 3: 9, 2: 4, 1: 1, 0: 0})

Otherwise It is shown as a dict (Counter is a dict subclass) if it is too 
large (multi-line):

  >>> pprint(Counter({i:i*i for i in range(10)}), width=20)
  {0: 0,
   1: 1,
   2: 4,
   3: 9,
   4: 16,
   5: 25,
   6: 36,
   7: 49,
   8: 64,
   9: 81}
 
the behaviour is weird but pprint doesn't promise that custom objects such 
as Counter that can't be created using Python literals will be printed in a 
reversible manner.

It seems there is a special support for some objects:

  >>> pprint(frozenset({i for i in range(10)}))
  frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
  >>> pprint(frozenset({i for i in range(10)}), width=20)
  frozenset({0,
             1,
             2,
             3,
             4,
             5,
             6,
             7,
             8,
             9})

Perhaps the support for Counter could be added using functools.singledispatch
and/or __prettyprint__ hook from issue #7434
msg218884 - (view) Author: Raymond Hettinger (rhettinger) * (Python committer) Date: 2014-05-21 20:02
I think this tracker item should be subsumed by the effort to write a better pprint API.   That would be better than trying to hack special cases into the current code which doesn't allow straight-forward customizations or extensions.

I recommend this entry be closed as a known problem that is just one of many and needs to be solved in a much larger context.
msg218928 - (view) Author: Ram Rachum (cool-RR) * Date: 2014-05-22 22:45
Maybe though this item should result in at least a test case for the future `pprint` redesign?
msg218934 - (view) Author: Raymond Hettinger (rhettinger) * (Python committer) Date: 2014-05-22 23:14
Please add a note to the other tracker item.
History
Date User Action Args
2022-04-11 14:58:03adminsetgithub: 65741
2014-05-22 23:14:02rhettingersetmessages: + msg218934
2014-05-22 22:45:59cool-RRsetmessages: + msg218928
2014-05-22 22:44:39rhettingersetstatus: open -> closed
superseder: general pprint rewrite
resolution: duplicate
2014-05-21 20:02:45rhettingersetmessages: + msg218884
2014-05-21 13:26:40akirasetnosy: + akira
messages: + msg218872
2014-05-20 20:08:13ned.deilysetnosy: + rhettinger
2014-05-20 15:32:41cool-RRcreate