为什么Python解释器使用repr()
来打印表达式?
例如:
>>> S = "First line.\nSecond line."
>>> S
'First line.\nSecond line.'
当然我可以通过print语句触发str()
:
>>> print S
First line.
Second line.
但为什么在交互模式下默认情况下不会触发str()
?在许多方面,这似乎是一个更好的选择。
答案 0 :(得分:6)
str()
用于"漂亮的打印",但在Python解释器中,您更可能需要背景信息,例如对象的id,它是什么类,等等(理论上),repr()
用于此。如果你运行pydoc __builtin__.repr
,它会说"对于大多数对象类型,eval(repr(object))== object。" 有些类型完全不同,但其__str__
方法返回相同的内容。例如,str(str(some_object))
与str(same_object)
相同,因此如果我有一个列表[0, 4, 5]
,并且我用str
打印,我会得到[0, 4, 5]
。如果我使用str(mylist)
打印str()
,即使它们属于不同类型,我仍会获得[0, 4, 5]
。但是,对于repr()
,str(mylist)
将打印为'[0, 4, 5]'
,这更像是我正在寻找的内容。使用解释器的人可能正在测试某些东西或调试某些东西,他想知道它是一个字符串,而不是真正的列表。
答案 1 :(得分:1)
repr
是一种方法,用于返回程序中object is represented的内容,而str
则返回它应如何向外显示。
例如
class Person(object):
def __init__(self, name, age, passport):
self.name = name
self.age = age
self.passport = passport
def __repr__(self):
return 'Name: {0}\nAge: {1}\nPassport: {2}'.format(self.name, self.age, self.passport)
def __str__(self):
return 'Hi, my name is {0}. How are you?'.format(self.name)
然后在交互式会话中,您可以:
>>> paul = Person('Paul', 30, 'XXXXXXXXX1')
>>> paul
Name: paul
Age: 30
Passport: XXXXXXXXX1
>>> print(paul)
Hi, my name is Paul. How are you?