为什么Python字典的__repr__比它的__str__更易读?

3
请看下面的示例:
In [33]: test = {x:str(x)*10 for x in range(10)}

In [35]: print test
{0: '0000000000', 1: '1111111111', 2: '2222222222', 3: '3333333333', 4: '4444444444', 5: '5555555555', 6: '6666666666', 7: '7777777777', 8: '8888888888', 9: '9999999999'}

In [34]: test
Out[34]: 
{0: '0000000000',
 1: '1111111111',
 2: '2222222222',
 3: '3333333333',
 4: '4444444444',
 5: '5555555555',
 6: '6666666666',
 7: '7777777777',
 8: '8888888888',
 9: '9999999999'}

打印函数(__str__)的输出比__repr__输出难以阅读。它是一行很长的文本,会自动换行成多行而且没有空格。两个输出都足够明确,可以根据其输出重新构建对象。
反过来的输出方式是否更有意义呢?使用__repr__提供紧凑的表示,而__str__则具有更易读的换行方式。

2
这会让你大吃一惊:repr(test) == str(test) - Aran-Fey
2
这只是IPython在提供帮助。 - Daniel Roseman
因为repr被IPython优化了。 - georgexsh
哦,该死。你是对的。 - anon
2个回答

4

这只是一个ipython的特性。在标准的Python 3.7 REPL中,输出如下:

>>> test = {x:str(x)*10 for x in range(10)}
>>> print(test)
{0: '0000000000', 1: '1111111111', 2: '2222222222', 3: '3333333333', 4: '4444444444', 5: '5555555555', 6: '6666666666', 7: '7777777777', 8: '8888888888', 9: '9999999999'}
>>> test
{0: '0000000000', 1: '1111111111', 2: '2222222222', 3: '3333333333', 4: '4444444444', 5: '5555555555', 6: '6666666666', 7: '7777777777', 8: '8888888888', 9: '9999999999'}
>>>

如果我们将其作为“普通”脚本执行,输出结果是相同的:

test = {x: str(x) * 10 for x in range(10)}
print(str(test))
#  {0: '0000000000', 1: '1111111111', 2: '2222222222', 3: '3333333333', 4: '4444444444', 5: '5555555555', 6: '6666666666', 7: '7777777777', 8: '8888888888', 9: '9999999999'}
print(repr(test))
#  {0: '0000000000', 1: '1111111111', 2: '2222222222', 3: '3333333333', 4: '4444444444', 5: '5555555555', 6: '6666666666', 7: '7777777777', 8: '8888888888', 9: '9999999999'}

如先前在评论中所提到的,strrepr表示中都没有换行符。

print(repr(test) == str(test))
# True

结论是这只是IPython主动使repr的输出更加人性化。

肯定不会完全调用 repr,而是单独对 dict 进行分解。 - Davis Herring

1
IPython可以做到这一点,所以print只是做常规的事情,但是仅仅命名变量就能做很酷的事情,这就是为什么......

使用print打印pandas数据框会变得难看,而仅仅命名变量就能美观地呈现。

请注意@Aran-Fey说:

"这会让你大吃一惊:repr(test) == str(test)"

有理由这样说,非IPython解释器无法实现这一点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接