Python中的 !r 和 !s 的字符串格式區別

!s(apply str())和!r(apply repr())可用於在格式化之前轉換值。

字符串之間的區別很容易看出來(因爲repr字符串將包含外部引號):

>>> 'foo {!s}'.format('bar')
'foo bar'
>>> 'foo {!r}'.format('bar')
"foo 'bar'"

這兩種方法之間的區別實際上主要取決於要格式化的對象。對於許多對象(例如那些不覆蓋該__str__方法的對象),格式化輸出將沒有差異。


在python中,有兩種相當自然的選擇來獲取… strrepr的字符串表示形式。 str通常更人性化,repr更精確。也許官方文檔是尋找差異的最佳地方:

object.__repr__(self)

  • repr()內置函數調用以計算對象的“正式”字符串表示形式。如果可能的話,這應該看起來像一個有效的Python表達式,可以用來重新創建具有相同值的對象(在適當的環境下)。如果這不可能,<...some useful description...>則應返回形式的字符串。返回值必須是一個字符串對象。如果定義了一個類,__repr__()但未定義__str__(),則__repr__()當需要該類的實例的“非正式”字符串表示形式時,也會使用該類。

  • 這通常用於調試,因此重要的是,表示形式必須信息豐富且明確。

object.__str__(self)

  • 由str(object)和內置函數format()和print()調用,以計算對象的“非正式”或可很好打印的字符串表示形式。返回值必須是一個字符串對象。
  • 此方法的不同之處在於,object.__repr__()不期望__str__()返回有效的Python表達式:可以使用更方便或更簡潔的表示形式。
  • 內置類型object invokes定義的默認實現object.__repr__()

str.format中,!s選擇用於str設置對象格式,而!r選擇repr設置值格式。


最後再寫個例子來更加的認識!r:🤭🤭🤭🤭🤭🤭🤭🤭🤭

name = '全洛'
line = 'Hello, World'
hi = f'{name}: {line}'
print(f'{hi!r}')

輸出結果爲:

'全洛: Hello, World'
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章