reprlib
— Alternate repr()
implementation¶
Вихідний код: Lib/reprlib.py
The reprlib
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.
Цей модуль надає клас, екземпляр і функцію:
- class reprlib.Repr¶
Клас, який надає служби форматування, корисні для реалізації функцій, подібних до вбудованих
repr()
; обмеження розміру для різних типів об’єктів додано, щоб уникнути генерації представлень, які є надмірно довгими.
- reprlib.aRepr¶
Це екземпляр
Repr
, який використовується для надання функціїrepr()
, описаної нижче. Зміна атрибутів цього об’єкта вплине на обмеження розміру, які використовуютьсяrepr()
і налагоджувачем Python.
- reprlib.repr(obj)¶
Це метод
repr()
дляaRepr
. Він повертає рядок, подібний до того, який повертає однойменна вбудована функція, але з обмеженнями на більшість розмірів.
In addition to size-limiting tools, the module also provides a decorator for
detecting recursive calls to __repr__()
and substituting a
placeholder string instead.
- @reprlib.recursive_repr(fillvalue='...')¶
Decorator for
__repr__()
methods to detect recursive calls within the same thread. If a recursive call is made, the fillvalue is returned, otherwise, the usual__repr__()
call is made. For example:>>> 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'>
Нове в версії 3.2.
Repr Objects¶
Екземпляри Repr
надають кілька атрибутів, які можна використовувати для встановлення обмежень розміру для представлень різних типів об’єктів, і методів, які форматують певні типи об’єктів.
- Repr.fillvalue¶
This string is displayed for recursive references. It defaults to
...
.Нове в версії 3.11.
- Repr.maxlevel¶
Обмеження глибини створення рекурсивних представлень. Типовим є
6
.
- Repr.maxdict¶
- Repr.maxlist¶
- Repr.maxtuple¶
- Repr.maxset¶
- Repr.maxfrozenset¶
- Repr.maxdeque¶
- Repr.maxarray¶
Обмеження на кількість записів, представлених для названого типу об’єкта. Типовим значенням є
4
дляmaxdict
,5
дляmaxarray
та6
для інших.
- Repr.maxlong¶
Максимальна кількість символів у представленні цілого числа. Цифри випадають із середини. Типовим є
40
.
- Repr.maxstring¶
Обмеження на кількість символів у представленні рядка. Зауважте, що «звичайне» представлення рядка використовується як джерело символів: якщо в представленні потрібні керуючі послідовності, вони можуть бути спотворені, коли представлення скорочено. Типовим значенням є
30
.
- Repr.maxother¶
Це обмеження використовується для керування розміром типів об’єктів, для яких немає спеціального методу форматування для об’єкта
Repr
. Його застосовують подібним чином доmaxstring
. Типовим значенням є20
.
- Repr.repr(obj)¶
Еквівалент вбудованого
repr()
, який використовує форматування, накладене екземпляром.
- Repr.repr1(obj, level)¶
Рекурсивна реалізація, яку використовує
repr()
. Тут використовується тип obj, щоб визначити, який метод форматування викликати, передаючи йому obj і level. Специфічні для типу методи повинні викликатиrepr1()
для виконання рекурсивного форматування зlevel - 1
для значення level у рекурсивному виклику.
- Repr.repr_TYPE(obj, level)
Методи форматування для конкретних типів реалізуються як методи з іменем на основі імені типу. У назві методу TYPE замінюється на
'_'.join(type(obj).__name__.split())
. Надсилання до цих методів обробляєтьсяrepr1()
. Специфічні для типу методи, які потребують рекурсивного форматування значення, мають викликатиself.repr1(subobj, level - 1)
.
Підкласифікація Repr Objects¶
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 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>'
<stdin>