pprint 排序字典而不是集合?

pprint sorting dicts but not sets?

我知道口述和集合没有顺序,所以相等的集合或口述可能打印不同(所有测试 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”)对字典进行排序但不对集合进行排序:

>>> 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}

它的文档还说 "Dictionaries are sorted by key before the display is computed"。但为什么它不对集合进行排序呢?对我来说似乎不漂亮。有没有办法让它 对集合进行排序?同样在嵌套结构中,因为这是 pprint.

的主要目的

这是在 issue 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 之间的不一致,以及单行多行行为之间的不一致,这使得这是一个错误。

对于 dicts,一个类似的例子说明了你所注意到的,输出按 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,pprintdict 进行排序可能被认为是令人惊讶的,因为它们 。然而,由于这只是一个实现细节(目前),我想 pprint 没有义务维护插入顺序(目前),这样做会破坏 pprint 在 Python 总是排序的版本 dicts.