Source code: Lib/repr.py
The repr module provides a means for producing object representations with limits on the size of the resulting strings. This is used in the Python debugger and may be useful in other contexts as well.
This module provides a class, an instance, and a function:
Class which provides formatting services useful in implementing functions similar to the built-in repr(); size limits for different object types are added to avoid the generation of representations which are excessively long.
This is the repr() method of aRepr. It returns a string similar to that returned by the built-in function of the same name, but with limits on most sizes.
Repr instances provide several attributes which can be used to provide size limits for the representations of different object types, and methods which format specific object types.
Depth limit on the creation of recursive representations. The default is 6.
Maximum number of characters in the representation for a long integer. Digits are dropped from the middle. The default is 40.
Limit on the number of characters in the representation of the string. Note that the “normal” representation of the string is used as the character source: if escape sequences are needed in the representation, these may be mangled when the representation is shortened. The default is 30.
The equivalent to the built-in repr() that uses the formatting imposed by the instance.
Recursive implementation used by repr(). This uses the type of obj to determine which formatting method to call, passing it obj and level. The type-specific methods should call repr1() to perform recursive formatting, with level - 1 for the value of level in the recursive call.
Formatting methods for specific types are implemented as methods with a name based on the type name. In the method name, TYPE is replaced by string.join(string.split(type(obj).__name__, '_')). Dispatch to these methods is handled by repr1(). Type-specific methods which need to recursively format a value should call self.repr1(subobj, level - 1).
The use of dynamic dispatching by Repr.repr1() allows subclasses of Repr to add support for additional built-in object types or to modify the handling of types already supported. This example shows how special support for file objects could be added:
import repr as reprlib import sys class MyRepr(reprlib.Repr): def repr_file(self, obj, level): if obj.name in ['<stdin>', '<stdout>', '<stderr>']: return obj.name else: return repr(obj) aRepr = MyRepr() print aRepr.repr(sys.stdin) # prints '<stdin>'