python的__repr__字典比__str__的可读性如何?

时间:2018-11-01 08:50:36

标签: python ipython repr

请参见以下示例:

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 个答案:

答案 0 :(得分: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的输出更人性化。

答案 1 :(得分:1)

IPython会这样做,所以print做常规的事情,但是仅仅命名变量会做一些很酷的事情,这就是为什么...

pandas dataframes打印print很难看,只是给变量命名就好

请注意,@Aran-Fey says

“这会让您大吃一惊:repr(test) == str(test)

很正确的是,非IPython解释器无法实现这一目标。