| 
									
										
										
										
											2008-05-16 07:12:44 +00:00
										 |  |  | :mod:`reprlib` --- Alternate :func:`repr` implementation
 | 
					
						
							| 
									
										
											  
											
												Merged revisions 63361-63373,63375,63377-63380 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
  r63361 | alexandre.vassalotti | 2008-05-16 03:14:08 -0400 (Fri, 16 May 2008) | 2 lines
  Rename the test file of reprlib.
........
  r63364 | georg.brandl | 2008-05-16 05:34:48 -0400 (Fri, 16 May 2008) | 2 lines
  Make generator repr consistent with function and code object repr.
........
  r63365 | georg.brandl | 2008-05-16 05:47:29 -0400 (Fri, 16 May 2008) | 2 lines
  #2869: remove parameter from signature.
........
  r63366 | christian.heimes | 2008-05-16 06:23:31 -0400 (Fri, 16 May 2008) | 1 line
  Fixed #2870: cmathmodule.c compile error
........
  r63367 | christian.heimes | 2008-05-16 07:28:56 -0400 (Fri, 16 May 2008) | 1 line
  Following Amaury's advice
........
  r63368 | georg.brandl | 2008-05-16 09:10:15 -0400 (Fri, 16 May 2008) | 2 lines
  #2890: support os.O_ASYNC and fcntl.FASYNC.
........
  r63369 | georg.brandl | 2008-05-16 09:18:50 -0400 (Fri, 16 May 2008) | 2 lines
  #2845: fix copy2's docs.
........
  r63370 | georg.brandl | 2008-05-16 09:24:29 -0400 (Fri, 16 May 2008) | 2 lines
  Don't allow keyword arguments to reversed().
........
  r63373 | georg.brandl | 2008-05-16 09:41:26 -0400 (Fri, 16 May 2008) | 2 lines
  Document O_ASYNC addition.
........
  r63380 | georg.brandl | 2008-05-16 13:33:13 -0400 (Fri, 16 May 2008) | 2 lines
  Fix reprlib docs.
........
											
										 
											2008-05-16 18:15:12 +00:00
										 |  |  | ========================================================
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-16 07:12:44 +00:00
										 |  |  | .. module:: reprlib
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  |    :synopsis: Alternate repr() implementation with size limits.
 | 
					
						
							| 
									
										
										
										
											2016-06-11 15:02:54 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | .. sectionauthor:: Fred L. Drake, Jr. <fdrake@acm.org>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-23 21:05:46 +00:00
										 |  |  | **Source code:** :source:`Lib/reprlib.py`
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | --------------
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-16 07:12:44 +00:00
										 |  |  | The :mod:`reprlib` module provides a means for producing object representations
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 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:: Repr()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Class which provides formatting services useful in implementing functions
 | 
					
						
							|  |  |  |    similar to the built-in :func:`repr`; size limits for  different object types
 | 
					
						
							|  |  |  |    are added to avoid the generation of representations which are excessively long.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. data:: aRepr
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-26 15:02:41 +00:00
										 |  |  |    This is an instance of :class:`Repr` which is used to provide the
 | 
					
						
							|  |  |  |    :func:`.repr` function described below.  Changing the attributes of this
 | 
					
						
							|  |  |  |    object will affect the size limits used by :func:`.repr` and the Python
 | 
					
						
							|  |  |  |    debugger.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. function:: repr(obj)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-26 15:02:41 +00:00
										 |  |  |    This is the :meth:`~Repr.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.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-13 21:36:00 +00:00
										 |  |  | In addition to size-limiting tools, the module also provides a decorator for
 | 
					
						
							|  |  |  | detecting recursive calls to :meth:`__repr__` and substituting a placeholder
 | 
					
						
							|  |  |  | string instead.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-20 19:26:09 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. index:: single: ...; placeholder
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-13 21:36:00 +00:00
										 |  |  | .. decorator:: recursive_repr(fillvalue="...")
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Decorator for :meth:`__repr__` methods to detect recursive calls within the
 | 
					
						
							|  |  |  |    same thread.  If a recursive call is made, the *fillvalue* is returned,
 | 
					
						
							|  |  |  |    otherwise, the usual :meth:`__repr__` call is made.  For example:
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-27 14:23:34 +02:00
										 |  |  |         >>> from reprlib import recursive_repr
 | 
					
						
							| 
									
										
										
										
											2010-09-13 21:36:00 +00:00
										 |  |  |         >>> class MyList(list):
 | 
					
						
							|  |  |  |         ...     @recursive_repr()
 | 
					
						
							| 
									
										
										
										
											2014-08-02 22:32:10 -07:00
										 |  |  |         ...     def __repr__(self):
 | 
					
						
							|  |  |  |         ...         return '<' + '|'.join(map(repr, self)) + '>'
 | 
					
						
							| 
									
										
										
										
											2010-09-13 21:36:00 +00:00
										 |  |  |         ...
 | 
					
						
							|  |  |  |         >>> m = MyList('abc')
 | 
					
						
							|  |  |  |         >>> m.append(m)
 | 
					
						
							|  |  |  |         >>> m.append('x')
 | 
					
						
							|  |  |  |         >>> print(m)
 | 
					
						
							|  |  |  |         <'a'|'b'|'c'|...|'x'>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.2
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. _repr-objects:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Repr Objects
 | 
					
						
							|  |  |  | ------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-07-04 11:28:30 -07:00
										 |  |  | :class:`Repr` instances provide several attributes which can be used to provide
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | size limits for the representations of different object types,  and methods
 | 
					
						
							|  |  |  | which format specific object types.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-22 16:45:58 -04:00
										 |  |  | .. attribute:: Repr.fillvalue
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This string is displayed for recursive references. It defaults to
 | 
					
						
							|  |  |  |    ``...``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    .. versionadded:: 3.11
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | .. attribute:: Repr.maxlevel
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Depth limit on the creation of recursive representations.  The default is ``6``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. attribute:: Repr.maxdict
 | 
					
						
							|  |  |  |                Repr.maxlist
 | 
					
						
							|  |  |  |                Repr.maxtuple
 | 
					
						
							|  |  |  |                Repr.maxset
 | 
					
						
							|  |  |  |                Repr.maxfrozenset
 | 
					
						
							|  |  |  |                Repr.maxdeque
 | 
					
						
							|  |  |  |                Repr.maxarray
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Limits on the number of entries represented for the named object type.  The
 | 
					
						
							|  |  |  |    default is ``4`` for :attr:`maxdict`, ``5`` for :attr:`maxarray`, and  ``6`` for
 | 
					
						
							|  |  |  |    the others.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. attribute:: Repr.maxlong
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-17 10:21:23 +00:00
										 |  |  |    Maximum number of characters in the representation for an integer.  Digits
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  |    are dropped from the middle.  The default is ``40``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. attribute:: Repr.maxstring
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    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``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. attribute:: Repr.maxother
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This limit is used to control the size of object types for which no specific
 | 
					
						
							|  |  |  |    formatting method is available on the :class:`Repr` object. It is applied in a
 | 
					
						
							|  |  |  |    similar manner as :attr:`maxstring`.  The default is ``20``.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. method:: Repr.repr(obj)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    The equivalent to the built-in :func:`repr` that uses the formatting imposed by
 | 
					
						
							|  |  |  |    the instance.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. method:: Repr.repr1(obj, level)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-26 15:02:41 +00:00
										 |  |  |    Recursive implementation used by :meth:`.repr`.  This uses the type of *obj* to
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  |    determine which formatting method to call, passing it *obj* and *level*.  The
 | 
					
						
							|  |  |  |    type-specific methods should call :meth:`repr1` to perform recursive formatting,
 | 
					
						
							|  |  |  |    with ``level - 1`` for the value of *level* in the recursive  call.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. method:: Repr.repr_TYPE(obj, level)
 | 
					
						
							|  |  |  |    :noindex: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    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
 | 
					
						
							| 
									
										
										
										
											2014-09-18 06:05:14 +03:00
										 |  |  |    ``'_'.join(type(obj).__name__.split())``. Dispatch to these methods is
 | 
					
						
							|  |  |  |    handled by :meth:`repr1`. Type-specific methods which need to recursively
 | 
					
						
							|  |  |  |    format a value should call ``self.repr1(subobj, level - 1)``.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. _subclassing-reprs:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Subclassing Repr Objects
 | 
					
						
							|  |  |  | ------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The use of dynamic dispatching by :meth:`Repr.repr1` allows subclasses of
 | 
					
						
							|  |  |  | :class:`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::
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-15 03:09:45 +00:00
										 |  |  |    import reprlib
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  |    import sys
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-15 03:09:45 +00:00
										 |  |  |    class MyRepr(reprlib.Repr):
 | 
					
						
							| 
									
										
										
										
											2014-10-12 05:11:16 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  |        def repr_TextIOWrapper(self, obj, level):
 | 
					
						
							|  |  |  |            if obj.name in {'<stdin>', '<stdout>', '<stderr>'}:
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  |                return obj.name
 | 
					
						
							| 
									
										
										
										
											2014-10-12 05:11:16 +03:00
										 |  |  |            return repr(obj)
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |    aRepr = MyRepr()
 | 
					
						
							| 
									
										
										
										
											2010-01-05 10:22:04 +00:00
										 |  |  |    print(aRepr.repr(sys.stdin))         # prints '<stdin>'
 |