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ónrepr()
descrita debajo. Cambiar los atributos de este objeto afectará los límites de tamaño usados porrepr()
y el depurador de Python.
-
reprlib.
repr
(obj)¶ Este es el método
repr()
deaRepr
. 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
paramaxdict
,5
paramaxarray
, y6
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 amaxstring
. El valor por defecto es20
.
-
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 invocarrepr1()
para realizar formateo recursivo, conlevel - 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 porrepr1()
. Los métodos de tipo específico que necesitan formatear recursivamente un valor deben invocarself.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>'