2016-02-25 35 views
0

为什么Python解释器使用repr()来打印表达式?为什么Python解释器使用repr()来打印表达式?

例如:

>>> S = "First line.\nSecond line." 
>>> S 
'First line.\nSecond line.' 

我当然可以触发str()通过print语句:

>>> print S 
First line. 
Second line. 

但为什么不str()在交互模式下默认触发?这在许多方面似乎都是更好的选择。

+3

完整的猜测:在一个互动的环境中,你可能会一个表达式的结果复制粘贴到一个新的表达。如果这是一个常见用例,那么'repr'比'str'更有用。 – Kevin

+2

因为它使**复杂**值的交互式调试更有意义!如果一个表达式产生一个类实例,一个简单的'print'可能会给你没有或误导性的信息。尝试打印一个'datetime'的实例,例如...是一个字符串还是一个对象...? – deceze

+4

*“在许多方面似乎都是更好的选择”* - 您提供的示例完全不会显示此内容,“repr”在字符串具有不可打印字符和空格的情况下是明确的。 – jonrsharpe

回答

6

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]'这更可能是我所寻找的。使用解释器的人可能会测试某些东西或调试某些东西,他会想知道它是一个字符串,而不是一个列表。

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?