reprlib —备用 repr()实现

源代码: Lib/reprlib.py


reprlib模块提供了一种生成对象表示的方法,该对象表示对结果字符串的大小有限制。这在 Python 调试器中使用,并且在其他上下文中也可能有用。

该模块提供了一个类,一个实例和一个函数:

  • 类别 reprlib. Repr

    • 提供格式化服务的类,可用于实现类似于内置repr()的Function;添加了不同对象类型的大小限制,以避免生成过长的表示。
  • reprlib. aRepr

    • 这是Repr的实例,用于提供以下所述的repr()Function。更改此对象的属性将影响repr()和 Python 调试器使用的大小限制。
  • reprlib. repr(* obj *)

    • 这是aReprrepr()方法。它返回的字符串与同名内置函数返回的字符串相似,但对大多数大小有限制。

除了大小限制工具之外,该模块还提供了一个装饰器,用于检测对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 版中的新Function。

Repr Objects

Repr实例提供了几个属性,这些属性可用于为不同对象类型的表示形式提供大小限制,并提供格式化特定对象类型的方法。

  • Repr. maxlevel

    • 创建递归表示的深度限制。默认值为6
  • Repr. maxdict

  • Repr. maxlist

  • Repr. maxtuple

  • Repr. maxset

  • Repr. maxfrozenset

  • Repr. maxdeque

  • Repr. maxarray

    • 限制为命名对象类型表示的条目数。默认值为_3 表示maxdict5表示maxarray,其他值为6
  • Repr. maxlong

    • 表示形式中的最大字符数。数字从中间掉落。默认值为40
  • Repr. maxstring

    • 限制字符串表示中的字符数。请注意,字符串的“普通”表示形式用作字符源:如果在表示形式中需要转义序列,则在缩短表示形式时可能会破坏它们。默认值为30
  • Repr. maxother

    • 此限制用于控制Repr对象上没有特定格式设置方法的对象类型的大小。它的应用方式与maxstring类似。默认值为20
  • Repr. repr(* obj *)

    • 与使用实例强加的格式的内置repr()等效。
  • 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>'