Подтвердить что ты не робот

Pprint сортирует dicts, но не устанавливает?

Я знаю, что dicts и sets не упорядочены, поэтому одинаковые наборы или dicts могут печатать по-разному (все тесты с Python 3.6.1):

>>> for obj in {0, 8}, {8, 0}, {0:0, 8:8}, {8:8, 0:0}:
        print(obj)

{0, 8}
{8, 0}
{0: 0, 8: 8}
{8: 8, 0: 0}

И я просто понял, что pprint ( "pretty-print" ) сортирует dicts, но не устанавливает:

>>> for obj in {0, 8}, {8, 0}, {0:0, 8:8}, {8:8, 0:0}:
        pprint.pprint(obj)

{0, 8}
{8, 0}
{0: 0, 8: 8}
{0: 0, 8: 8}

В документации также говорится: "Словари сортируются по ключу перед вычислением дисплея". Но почему он не сортирует множество? Не кажется мне симпатичным. И есть ли способ сделать его сортировкой? Также внутри вложенных структур, поскольку это основная цель pprint.

4b9b3361

Ответ 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.