New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
pprint doesn't work well for counters, sometimes shows them like a dict #65741
Comments
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}
>>> |
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 >>> 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 |
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. |
Maybe though this item should result in at least a test case for the future |
Please add a note to the other tracker item. |
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
The text was updated successfully, but these errors were encountered: