首页 > 解决方案 > 为什么 python 的 __repr__ 的 dict 比它的 __str__ 更具可读性?

问题描述

请参见以下示例:

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__ 具有更易读的换行符?

标签: pythonipythonrepr

解决方案


这只是一个 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'}

str或表示中没有换行符repr,正如之前在评论中提到的那样:

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

结论是,这只是 ipython 主动让repr' 输出更人性化。


推荐阅读