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è)占位符來(lái)替換。

@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ì)象上沒(méi)有特定的格式化方法可用的對(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 的類型來(lái)確定要調(diào)用哪個(gè)格式化方法,并傳入 objlevel。 類型專屬的方法應(yīng)當(dāng)調(diào)用 repr1() 來(lái)執(zhí)行遞歸格式化,在遞歸調(diào)用中使用 level - 1 作為 level 的值。

Repr.repr_TYPE(obj, level)

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

子類化 Repr 對(duì)象?

通過(guò) 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>'