爲什麼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