为什么Python解释器使用repr()
来打印表达式?为什么Python解释器使用repr()来打印表达式?
例如:
>>> S = "First line.\nSecond line."
>>> S
'First line.\nSecond line.'
我当然可以触发str()
通过print语句:
>>> print S
First line.
Second line.
但为什么不str()
在交互模式下默认触发?这在许多方面似乎都是更好的选择。
为什么Python解释器使用repr()
来打印表达式?为什么Python解释器使用repr()来打印表达式?
例如:
>>> S = "First line.\nSecond line."
>>> S
'First line.\nSecond line.'
我当然可以触发str()
通过print语句:
>>> print S
First line.
Second line.
但为什么不str()
在交互模式下默认触发?这在许多方面似乎都是更好的选择。
str()
用于“漂亮打印”,但在Python解释器中,您更可能需要背景信息,如对象的id,它是什么类等等(理论上),并且repr()
是用于此。如果运行pydoc __builtin__.repr
,它说“对于大多数对象类型,eval(repr(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]'
这更可能是我所寻找的。使用解释器的人可能会测试某些东西或调试某些东西,他会想知道它是一个字符串,而不是一个列表。
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?
完整的猜测:在一个互动的环境中,你可能会一个表达式的结果复制粘贴到一个新的表达。如果这是一个常见用例,那么'repr'比'str'更有用。 – Kevin
因为它使**复杂**值的交互式调试更有意义!如果一个表达式产生一个类实例,一个简单的'print'可能会给你没有或误导性的信息。尝试打印一个'datetime'的实例,例如...是一个字符串还是一个对象...? – deceze
*“在许多方面似乎都是更好的选择”* - 您提供的示例完全不会显示此内容,“repr”在字符串具有不可打印字符和空格的情况下是明确的。 – jonrsharpe