2016-02-25 37 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?