reprlib --- 另一種 repr() 實(shí)現(xiàn)?

源代碼: Lib/reprlib.py


reprlib 模塊提供了一種對(duì)象表示的產(chǎn)生方式,它會(huì)對(duì)結(jié)果字符串的大小進(jìn)行限制。 該方式被用于 Python 調(diào)試器,也適用于某些其他場(chǎng)景。

此模塊提供了一個(gè)類、一個(gè)實(shí)例和一個(gè)函數(shù):

class reprlib.Repr?

該類提供了格式化服務(wù) 適用于實(shí)現(xiàn)與內(nèi)置 repr() 相似的方法;其中附加了針對(duì)不同對(duì)象類型的大小限制,以避免生成超長(zhǎng)的表示。

reprlib.aRepr?

這是 Repr 的一個(gè)實(shí)例,用于提供如下所述的 repr() 函數(shù)。 改變此對(duì)象的屬性將會(huì)影響 repr() 和 Python 調(diào)試器所使用的大小限制。

reprlib.repr(obj)?

這是 aReprrepr() 方法。 它會(huì)返回與同名內(nèi)置函數(shù)所返回字符串相似的字符串,區(qū)別在于附帶了對(duì)多數(shù)類型的大小限制。

在大小限制工具以外,此模塊還提供了一個(gè)裝飾器,用于檢測(cè)對(duì) __repr__() 的遞歸調(diào)用并改用一個(gè)占位符來替換。

@reprlib.recursive_repr(fillvalue='...')?

用于為 __repr__() 方法檢測(cè)同一線程內(nèi)部遞歸調(diào)用的裝飾器。 如果執(zhí)行了遞歸調(diào)用,則會(huì)返回 fillvalue,否則執(zhí)行正常的 __repr__() 調(diào)用。 例如:

>>>
>>> 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 對(duì)象?

Repr 實(shí)例對(duì)象包含一些屬性可以用于為不同對(duì)象類型的表示提供大小限制,還包含一些方法可以格式化特定的對(duì)象類型。

Repr.fillvalue?

This string is displayed for recursive references. It defaults to ....

3.11 新版功能.

Repr.maxlevel?

創(chuàng)建遞歸表示形式的深度限制。 默認(rèn)為 6。

Repr.maxdict?
Repr.maxlist?
Repr.maxtuple?
Repr.maxset?
Repr.maxfrozenset?
Repr.maxdeque?
Repr.maxarray?

表示命名對(duì)象類型的條目數(shù)量限制。 對(duì)于 maxdict 的默認(rèn)值為 4,對(duì)于 maxarray5,對(duì)于其他則為 6。

Repr.maxlong?

表示整數(shù)的最大字符數(shù)量。 數(shù)碼會(huì)從中間被丟棄。 默認(rèn)值為 40。

Repr.maxstring?

表示字符串的字符數(shù)量限制。 請(qǐng)注意字符源會(huì)使用字符串的“正?!北硎拘问剑喝绻硎局行枰玫睫D(zhuǎn)義序列,在縮短表示時(shí)它們可能會(huì)被破壞。 默認(rèn)值為 30。

Repr.maxother?

此限制用于控制在 Repr 對(duì)象上沒有特定的格式化方法可用的對(duì)象類型的大小。 它會(huì)以類似 maxstring 的方式被應(yīng)用。 默認(rèn)值為 20。

Repr.repr(obj)?

內(nèi)置 repr() 的等價(jià)形式,它使用實(shí)例專屬的格式化。

Repr.repr1(obj, level)?

repr() 使用的遞歸實(shí)現(xiàn)。 此方法使用 obj 的類型來確定要調(diào)用哪個(gè)格式化方法,并傳入 objlevel。 類型專屬的方法應(yīng)當(dāng)調(diào)用 repr1() 來執(zhí)行遞歸格式化,在遞歸調(diào)用中使用 level - 1 作為 level 的值。

Repr.repr_TYPE(obj, level)

特定類型的格式化方法會(huì)被實(shí)現(xiàn)為基于類型名稱來命名的方法。 在方法名稱中,TYPE 會(huì)被替換為 '_'.join(type(obj).__name__.split())。 對(duì)這些方法的分派會(huì)由 repr1() 來處理。 需要對(duì)值進(jìn)行遞歸格式化的類型專屬方法應(yīng)當(dāng)調(diào)用 self.repr1(subobj, level - 1)。

子類化 Repr 對(duì)象?

通過 Repr.repr1() 使用動(dòng)態(tài)分派允許 Repr 的子類添加對(duì)額外內(nèi)置對(duì)象類型的支持,或是修改對(duì)已支持類型的處理。 這個(gè)例子演示了如何添加對(duì)文件對(duì)象的特殊支持:

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>'