reprlib — Implementação alternativa à repr()¶
Código-fonte: Lib/reprlib.py
O módulo reprlib fornece um meio de produzir representações de objetos com limites no tamanho das strings resultantes. Isso é usado no depurador Python e pode ser útil em outros contextos também.
Este módulo fornece uma classe, uma instância e uma função.
- class reprlib.Repr(*, maxlevel=6, maxtuple=6, maxlist=6, maxarray=5, maxdict=4, maxset=6, maxfrozenset=6, maxdeque=6, maxstring=30, maxlong=40, maxother=30, fillvalue='...', indent=None)¶
Classe que fornece serviços de formatação úteis na implementação de funções semelhantes à embutida
repr(); limites de tamanho para diferentes tipos de objetos são adicionados para evitar a geração de representações excessivamente longas.Os argumentos nomeados do construtor podem ser usados como um atalho para definir os atributos da instância de
Repr. O que significa que a inicialização a seguir:aRepr = reprlib.Repr(maxlevel=3)
É equivalente a:
aRepr = reprlib.Repr() aRepr.maxlevel = 3
Consulte a seção Objetos Repr para obter mais informações sobre atributos
Repr.Alterado na versão 3.12: Permite que atributos sejam definidos por meio de argumentos nomeados.
- reprlib.aRepr¶
Esta é uma instância de
Reprque é usada para fornecer a funçãorepr()descrita abaixo. Alterar os atributos deste objeto afetará os limites de tamanho usados porrepr()e pelo depurador Python.
- reprlib.repr(obj)¶
Este é o método
repr()deaRepr. Ele retorna uma string semelhante à retornada pela função embutida de mesmo nome, mas com limites na maioria dos tamanhos.
Além das ferramentas de limitação de tamanho, o módulo também fornece um decorador para detectar chamadas recursivas para __repr__() e substituir uma string de espaço reservado.
- @reprlib.recursive_repr(fillvalue='...')¶
Decorador para métodos
__repr__()para detectar chamadas recursivas dentro da mesma thread. Se uma chamada recursiva for feita, o fillvalue é retornado; caso contrário, a chamada usual__repr__()é feita. Por exemplo:>>> 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'>
Adicionado na versão 3.2.
Objetos Repr¶
Instâncias Repr fornecem vários atributos que podem ser usados para fornecer limites de tamanho para as representações de diferentes tipos de objetos e métodos que formatam tipos de objetos específicos.
- Repr.fillvalue¶
Esta string é exibida para referências recursivas. O padrão é
....Adicionado na versão 3.11.
- Repr.maxlevel¶
Limite de profundidade na criação de representações recursivas. O padrão é
6.
- Repr.maxdict¶
- Repr.maxlist¶
- Repr.maxtuple¶
- Repr.maxset¶
- Repr.maxfrozenset¶
- Repr.maxdeque¶
- Repr.maxarray¶
Limites no número de entradas representadas para o tipo de objeto nomeado. O padrão é
4paramaxdict,5paramaxarraye6para os demais.
- Repr.maxlong¶
Número máximo de caracteres na representação para um inteiro. Os dígitos são omitidos a partir do meio. O padrão é
40.
- Repr.maxstring¶
Limite no número de caracteres na representação da string. Observe que a representação “normal” da string é usada como fonte de caracteres: se sequências de escape forem necessárias na representação, elas poderão ser distorcidas quando a representação for encurtada. O padrão é
30.
- Repr.maxother¶
Este limite é usado para controlar o tamanho de tipos de objetos para os quais nenhum método de formatação específico está disponível no objeto
Repr. Ele é aplicado de maneira semelhante amaxstring. O padrão é20.
- Repr.indent¶
Se este atributo for definido como
None(o padrão), a saída será formatada sem quebras de linha ou recuo, como o padrãorepr(). Por exemplo:>>> example = [ ... 1, 'spam', {'a': 2, 'b': 'spam eggs', 'c': {3: 4.5, 6: []}}, 'ham'] >>> import reprlib >>> aRepr = reprlib.Repr() >>> print(aRepr.repr(example)) [1, 'spam', {'a': 2, 'b': 'spam eggs', 'c': {3: 4.5, 6: []}}, 'ham']
Se
indentfor definido como uma string, cada nível de recursão será colocado em sua própria linha, recuado por essa string:>>> aRepr.indent = '-->' >>> print(aRepr.repr(example)) [ -->1, -->'spam', -->{ -->-->'a': 2, -->-->'b': 'spam eggs', -->-->'c': { -->-->-->3: 4.5, -->-->-->6: [], -->-->}, -->}, -->'ham', ]
Definir
indentcomo um valor inteiro positivo se comporta como se fosse definido como uma string com esse número de espaços:>>> aRepr.indent = 4 >>> print(aRepr.repr(example)) [ 1, 'spam', { 'a': 2, 'b': 'spam eggs', 'c': { 3: 4.5, 6: [], }, }, 'ham', ]
Adicionado na versão 3.12.
- Repr.repr1(obj, level)¶
Implementação recursiva usada por
repr(). Esta usa o tipo de obj para determinar qual método de formatação chamar, passando obj e level. Os métodos específicos de tipo devem chamarrepr1()para realizar a formatação recursiva, comlevel - 1para o valor de level na chamada recursiva.
- Repr.repr_TYPE(obj, level)
Métodos de formatação para tipos específicos são implementados como métodos com um nome baseado no nome do tipo. No nome do método, TYPE é substituído por
'_'.join(type(obj).__name__.split()). O despacho para esses métodos é tratado porrepr1(). Métodos específicos de tipo que precisam formatar um valor recursivamente devem chamarself.repr1(subobj, level - 1).
Estendendo objetos Repr¶
O uso de despacho dinâmico por Repr.repr1() permite que subclasses de Repr adicionem suporte para tipos de objetos embutidos adicionais ou modifiquem o tratamento de tipos já suportados. Este exemplo mostra como suporte especial para objetos arquivo pode ser adicionado:
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)) # exibe '<stdin>'
<stdin>