"reprlib" --- Implementación "repr()" alternativa
*************************************************

**Código fuente:** Lib/reprlib.py

======================================================================

El módulo "reprlib" provee de los medios necesarios para producir
representaciones de objetos con límites en el tamaño de las cadenas
resultantes. Es usado en el depurador de Python y puede ser útil
también en otros contextos.

Este módulo provee una clase, una instancia y una función:

class reprlib.Repr

   Clase que provee de servicios de formateo útiles en la
   implementación de funciones similar a la integrada "repr()"; los
   límites de tamaño para diferentes tipos de objetos son añadidos
   para evitar la generación de representaciones que son excesivamente
   largas.

reprlib.aRepr

   Esta es una instancia de "Repr" que es usada para proveer la
   función "repr()" descrita debajo. Cambiar los atributos de este
   objeto afectará los límites de tamaño usados por "repr()" y el
   depurador de Python.

reprlib.repr(obj)

   Este es el método "repr()" de "aRepr". Retorna una cadena similar a
   la retornada por la función integrada del mismo nombre, pero con
   límites en la mayoría de tamaños.

Además de las herramientas de limitación de tamaño, el módulo también
provee un decorador para detectar invocaciones recursivas a
"__repr__()" y sustituyendo por un marcador de posición de cadena en
su lugar.

@reprlib.recursive_repr(fillvalue="...")

   Decorador para métodos "__repr__()" que detecta invocaciones
   recursivas dentro del mismo hilo. Si se produce una invocación
   recursiva, el *fillvalue* es retornado, si no, se produce la
   invocación "__repr__()" habitual. Por ejemplo:

   >>> 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'>

   Nuevo en la versión 3.2.


Objetos Repr
============

Las instancias "Repr" proveen varios atributos que pueden ser usados
para proporcionar límites de tamaño para las representaciones de
diferentes tipos de objetos, y métodos que formatean tipos de objetos
específicos.

Repr.maxlevel

   Límite de profundidad en la creación de representaciones
   recursivas. El valor por defecto es "6".

Repr.maxdict
Repr.maxlist
Repr.maxtuple
Repr.maxset
Repr.maxfrozenset
Repr.maxdeque
Repr.maxarray

   Límites en el número de entradas representadas por el tipo de
   objeto nombrado. El valor por defecto es "4" para "maxdict", "5"
   para  "maxarray", y "6" para los otros.

Repr.maxlong

   Máximo número de caracteres en la representación para un entero.
   Los dígitos son eliminados desde el medio. El valor por defecto es
   "40".

Repr.maxstring

   Límite en el número de caracteres en la representación de la
   cadena. Fíjese que la representación "normal" de la cadena  es la
   usada como la fuente de caracteres: si se necesitan secuencias de
   escape en la representación, estas pueden ser desordenadas cuando
   la representación se ha acortado. El valor por defecto es "30".

Repr.maxother

   Este límite es usado para controlar el tamaño de los tipos de
   objetos para los cuales no hay ningún método de formateo específico
   en el objeto "Repr". Se aplica de una manera similar a "maxstring".
   El valor por defecto es "20".

Repr.repr(obj)

   El equivalente a la función integrada "repr()" que usa el formateo
   impuesto por la instancia.

Repr.repr1(obj, level)

   Implementación recursiva usada por "repr()". Este usa el tipo de
   *obj* para determinar qué método invocar, pasándole *obj* y
   *level*. Los métodos de tipo específico deben invocar "repr1()"
   para realizar formateo recursivo, con "level - 1" para el valor de
   *level* en la invocación recursiva.

Repr.repr_TYPE(obj, level)

   Métodos de formateo para tipos específicos son implementados como
   métodos con un nombre basado en el nombre del tipo. En el nombre
   del método, **TYPE** es reemplazado por
   "'_'.join(type(obj).__name__.split())". El envío a estos métodos es
   gestionado por "repr1()". Los métodos de tipo específico que
   necesitan formatear recursivamente un valor deben invocar
   "self.repr1(subobj, level - 1)".


Subclasificando Objetos Repr
============================

El uso de envíos dinámicos por "Repr.repr1()" permite a las subclases
de "Repr" añadir soporte para tipos adicionales de objetos integrados
o modificar el manejo de tipos ya soportados. Este ejemplo muestra
como el soporte especial para objetos de tipo archivo puede ser
añadido.

   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>'
