1
:mod:`reprlib` --- Alternate :func:`repr` implementation
2
========================================================
5
:synopsis: Alternate repr() implementation with size limits.
7
.. sectionauthor:: Fred L. Drake, Jr. <fdrake@acm.org>
9
**Source code:** :source:`Lib/reprlib.py`
13
The :mod:`reprlib` module provides a means for producing object representations
14
with limits on the size of the resulting strings. This is used in the Python
15
debugger and may be useful in other contexts as well.
17
This module provides a class, an instance, and a function:
22
Class which provides formatting services useful in implementing functions
23
similar to the built-in :func:`repr`; size limits for different object types
24
are added to avoid the generation of representations which are excessively long.
29
This is an instance of :class:`Repr` which is used to provide the
30
:func:`.repr` function described below. Changing the attributes of this
31
object will affect the size limits used by :func:`.repr` and the Python
35
.. function:: repr(obj)
37
This is the :meth:`~Repr.repr` method of ``aRepr``. It returns a string
38
similar to that returned by the built-in function of the same name, but with
41
In addition to size-limiting tools, the module also provides a decorator for
42
detecting recursive calls to :meth:`__repr__` and substituting a placeholder
45
.. decorator:: recursive_repr(fillvalue="...")
47
Decorator for :meth:`__repr__` methods to detect recursive calls within the
48
same thread. If a recursive call is made, the *fillvalue* is returned,
49
otherwise, the usual :meth:`__repr__` call is made. For example:
51
>>> class MyList(list):
53
... def __repr__(self):
54
... return '<' + '|'.join(map(repr, self)) + '>'
70
:class:`Repr` instances provide several attributes which can be used to provide
71
size limits for the representations of different object types, and methods
72
which format specific object types.
75
.. attribute:: Repr.maxlevel
77
Depth limit on the creation of recursive representations. The default is ``6``.
80
.. attribute:: Repr.maxdict
88
Limits on the number of entries represented for the named object type. The
89
default is ``4`` for :attr:`maxdict`, ``5`` for :attr:`maxarray`, and ``6`` for
93
.. attribute:: Repr.maxlong
95
Maximum number of characters in the representation for an integer. Digits
96
are dropped from the middle. The default is ``40``.
99
.. attribute:: Repr.maxstring
101
Limit on the number of characters in the representation of the string. Note
102
that the "normal" representation of the string is used as the character source:
103
if escape sequences are needed in the representation, these may be mangled when
104
the representation is shortened. The default is ``30``.
107
.. attribute:: Repr.maxother
109
This limit is used to control the size of object types for which no specific
110
formatting method is available on the :class:`Repr` object. It is applied in a
111
similar manner as :attr:`maxstring`. The default is ``20``.
114
.. method:: Repr.repr(obj)
116
The equivalent to the built-in :func:`repr` that uses the formatting imposed by
120
.. method:: Repr.repr1(obj, level)
122
Recursive implementation used by :meth:`.repr`. This uses the type of *obj* to
123
determine which formatting method to call, passing it *obj* and *level*. The
124
type-specific methods should call :meth:`repr1` to perform recursive formatting,
125
with ``level - 1`` for the value of *level* in the recursive call.
128
.. method:: Repr.repr_TYPE(obj, level)
131
Formatting methods for specific types are implemented as methods with a name
132
based on the type name. In the method name, **TYPE** is replaced by
133
``'_'.join(type(obj).__name__.split())``. Dispatch to these methods is
134
handled by :meth:`repr1`. Type-specific methods which need to recursively
135
format a value should call ``self.repr1(subobj, level - 1)``.
138
.. _subclassing-reprs:
140
Subclassing Repr Objects
141
------------------------
143
The use of dynamic dispatching by :meth:`Repr.repr1` allows subclasses of
144
:class:`Repr` to add support for additional built-in object types or to modify
145
the handling of types already supported. This example shows how special support
146
for file objects could be added::
151
class MyRepr(reprlib.Repr):
153
def repr_TextIOWrapper(self, obj, level):
154
if obj.name in {'<stdin>', '<stdout>', '<stderr>'}:
159
print(aRepr.repr(sys.stdin)) # prints '<stdin>'