Ответ 1
Это было поднято в проблема 27495, и это ошибка, а не просто выбор дизайна, но, по-видимому, еще не разрешена.
Вот еще один пример из проблемы, который, возможно, более очевидно показывает поведение, которое вы идентифицируете в Python 3:
>>> import string, pprint >>> pprint.pprint(set(string.digits)) {'7', '1', '9', '8', '3', '0', '2', '5', '6', '4'}
То же самое относится и к frozenset()
, но обратите внимание, что многострочные выходы pprint
сортируются в Python 3, например:
>>> pprint.pprint(set(string.digits), width=1) {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}
Однако, в Python 2, результат от того же исходного кода сортируется:
>>> pprint.pprint(set(string.digits)) set(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'])
Я думаю, что это несоответствие между Python 3 и Python 2, а также между однострочным многострочным поведением, что делает эту ошибку.
Для dict
s аналогичный пример иллюстрирует, как вы отмечаете, что вывод сортируется в Python 3 или 2, как и должно быть:
>>> 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}
Однако для Python 3.6 можно считать удивительным, что pprint
сортирует dict
, так как они теперь упорядочены. Однако, поскольку это всего лишь деталь реализации (на данный момент), я полагаю, что для pprint
для поддержания порядка вставки (пока) нет никаких обязательств, и это приведет к нарушению pprint
собственной согласованности в версиях Python всегда сортировки dict
s.