!s(apply str())和!r(apply repr())可用於在格式化之前轉換值。
字符串之間的區別很容易看出來(因爲repr字符串將包含外部引號):
>>> 'foo {!s}'.format('bar')
'foo bar'
>>> 'foo {!r}'.format('bar')
"foo 'bar'"
這兩種方法之間的區別實際上主要取決於要格式化的對象。對於許多對象(例如那些不覆蓋該__str__
方法的對象),格式化輸出將沒有差異。
在python中,有兩種相當自然的選擇來獲取… str
和repr
的字符串表示形式。 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'