reprlib
— 替代 repr()
實現¶
原始碼: Lib/reprlib.py
reprlib
模組提供了一種生成物件表示的方法,該表示對生成的字串的大小有限制。 這在 Python 偵錯程式中使用,並且在其他上下文中也可能有用。
此模組提供一個類,一個例項和一個函式
- class reprlib.Repr(*, maxlevel=6, maxtuple=6, maxlist=6, maxarray=5, maxdict=4, maxset=6, maxfrozenset=6, maxdeque=6, maxstring=30, maxlong=40, maxother=30, fillvalue='...', indent=None)¶
類,提供有用的格式化服務,用於實現類似於內建
repr()
的函式;添加了不同物件型別的大小限制,以避免生成過長的表示形式。建構函式的關鍵字引數可以用作設定
Repr
例項屬性的快捷方式。 這意味著以下初始化aRepr = reprlib.Repr(maxlevel=3)
等價於
aRepr = reprlib.Repr() aRepr.maxlevel = 3
有關
Repr
屬性的更多資訊,請參見 Repr 物件 部分。在 3.12 版本中更改: 允許透過關鍵字引數設定屬性。
除了大小限制工具外,該模組還提供了一個裝飾器,用於檢測對 __repr__()
的遞迴呼叫,並替換為一個佔位符字串。
- @reprlib.recursive_repr(fillvalue='...')¶
用於
__repr__()
方法的裝飾器,用於檢測同一執行緒內的遞迴呼叫。 如果進行了遞迴呼叫,則返回 fillvalue,否則進行通常的__repr__()
呼叫。 例如>>> from reprlib import recursive_repr >>> class MyList(list): ... @recursive_repr() ... def __repr__(self): ... return '<' + '|'.join(map(repr, self)) + '>' ... >>> m = MyList('abc') >>> m.append(m) >>> m.append('x') >>> print(m) <'a'|'b'|'c'|...|'x'>
3.2 版本中新增。
Repr 物件¶
Repr
例項提供了多個屬性,可用於為不同物件型別的表示形式提供大小限制,以及格式化特定物件型別的方法。
- Repr.fillvalue¶
此字串顯示用於遞迴引用。 預設為
...
。3.11 版本中新增。
- Repr.maxlevel¶
建立遞迴表示形式的深度限制。 預設為
6
。
- Repr.maxdict¶
- Repr.maxlist¶
- Repr.maxtuple¶
- Repr.maxset¶
- Repr.maxfrozenset¶
- Repr.maxdeque¶
- Repr.maxarray¶
- Repr.maxlong¶
整數表示形式中的最大字元數。 數字從中間刪除。 預設為
40
。
- Repr.maxstring¶
字串表示形式中的字元數限制。 請注意,字串的“正常”表示形式用作字元源:如果在表示形式中需要轉義序列,則在縮短表示形式時可能會對其進行破壞。 預設為
30
。
- Repr.indent¶
如果此屬性設定為
None
(預設),則輸出的格式化方式與標準repr()
一樣,沒有換行符或縮排。 例如>>> example = [ ... 1, 'spam', {'a': 2, 'b': 'spam eggs', 'c': {3: 4.5, 6: []}}, 'ham'] >>> import reprlib >>> aRepr = reprlib.Repr() >>> print(aRepr.repr(example)) [1, 'spam', {'a': 2, 'b': 'spam eggs', 'c': {3: 4.5, 6: []}}, 'ham']
如果
indent
設定為字串,則每個遞迴級別都放置在單獨的行上,並用該字串縮排>>> aRepr.indent = '-->' >>> print(aRepr.repr(example)) [ -->1, -->'spam', -->{ -->-->'a': 2, -->-->'b': 'spam eggs', -->-->'c': { -->-->-->3: 4.5, -->-->-->6: [], -->-->}, -->}, -->'ham', ]
將
indent
設定為正整數值,其行為如同將其設定為包含該數字空格數的字串。>>> aRepr.indent = 4 >>> print(aRepr.repr(example)) [ 1, 'spam', { 'a': 2, 'b': 'spam eggs', 'c': { 3: 4.5, 6: [], }, }, 'ham', ]
在版本 3.12 中新增。
- Repr.repr1(obj, level)¶
由
repr()
使用的遞迴實現。這會使用 obj 的型別來確定要呼叫的格式化方法,並傳遞 obj 和 level。特定於型別的方法應該呼叫repr1()
來執行遞迴格式化,並在遞迴呼叫中使用level - 1
作為 level 的值。
- Repr.repr_TYPE(obj, level)
特定型別的格式化方法被實現為名稱基於型別名稱的方法。在方法名稱中,TYPE 會被替換為
'_'.join(type(obj).__name__.split())
。對這些方法的排程由repr1()
處理。需要遞迴格式化值的特定型別的方法應該呼叫self.repr1(subobj, level - 1)
。
子類化 Repr 物件¶
Repr.repr1()
對動態排程的使用允許 Repr
的子類為其他內建物件型別新增支援,或修改對已支援型別的處理。此示例展示瞭如何為檔案物件新增特殊支援
import reprlib
import sys
class MyRepr(reprlib.Repr):
def repr_TextIOWrapper(self, obj, level):
if obj.name in {'<stdin>', '<stdout>', '<stderr>'}:
return obj.name
return repr(obj)
aRepr = MyRepr()
print(aRepr.repr(sys.stdin)) # prints '<stdin>'
<stdin>