This was raised in issue 27495 and it is a bug, rather than just a design choice, but apparently has not yet been resolved.
Here is another example from the issue that illustrates perhaps more obviously the behavior you identify in Python 3:
>>> import string, pprint
>>> pprint.pprint(set(string.digits))
{'7', '1', '9', '8', '3', '0', '2', '5', '6', '4'}
The same applies for frozenset()
too, but note that multi-line pprint
outputs are sorted in Python 3, for example:
>>> pprint.pprint(set(string.digits), width=1)
{'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9'}
However, in Python 2, the output from the same original code is sorted:
>>> pprint.pprint(set(string.digits))
set(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'])
I think it is the inconsistency between Python 3 and Python 2, and between the single-line multi-line behavior, that makes this a bug.
For dict
s, a similar example, illustrates as you note, that the output is sorted in either Python 3 or 2, as it should be:
>>> pprint.pprint({i:None for i in set(string.digits)})
{'0': None,
'1': None,
'2': None,
'3': None,
'4': None,
'5': None,
'6': None,
'7': None,
'8': None,
'9': None}
However, for Python 3.6, it could be considered surprising that pprint
sorts dict
s since they are ordered now. However, since this is just an implementation detail (for now) I guess there is no obligation for pprint
to maintain the insertion order (yet), and doing so would break pprint
's own consistency across Python versions of always sorting dict
s.
pprint.PrettyPrinter
and overridepformat
to handle sets if you wanted... – Smokechaser