reprlib — Alternative repr() Implementierung¶
Quellcode: Lib/reprlib.py
Das Modul reprlib bietet eine Möglichkeit, Objekt-Repräsentationen mit Grenzwerten für die Größe der resultierenden Strings zu erzeugen. Dies wird im Python-Debugger verwendet und kann auch in anderen Kontexten nützlich sein.
Dieses Modul stellt eine Klasse, eine Instanz und eine Funktion bereit
- 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)¶
Klasse, die Formatierungsdienste bereitstellt, die für die Implementierung von Funktionen ähnlich der eingebauten
repr()nützlich sind; Größenbeschränkungen für verschiedene Objekttypen werden hinzugefügt, um die Erzeugung von übermäßig langen Repräsentationen zu vermeiden.Die Schlüsselwortargumente des Konstruktors können als Abkürzung verwendet werden, um die Attribute der
Repr-Instanz festzulegen. Das bedeutet, dass die folgende InitialisierungaRepr = reprlib.Repr(maxlevel=3)
Ist äquivalent zu
aRepr = reprlib.Repr() aRepr.maxlevel = 3
Siehe Abschnitt Repr-Objekte für weitere Informationen zu
Repr-Attributen.Geändert in Version 3.12: Attribute können über Schlüsselwortargumente gesetzt werden.
- reprlib.aRepr¶
Dies ist eine Instanz von
Repr, die zur Bereitstellung der unten beschriebenenrepr()-Funktion verwendet wird. Das Ändern der Attribute dieses Objekts wirkt sich auf die vonrepr()und dem Python-Debugger verwendeten Größenbeschränkungen aus.
- reprlib.repr(obj)¶
Dies ist die
repr()-Methode vonaRepr. Sie gibt einen String zurück, der dem von der eingebauten Funktion mit demselben Namen zurückgegebenen String ähnelt, jedoch mit Grenzwerten für die meisten Größen.
Zusätzlich zu den Werkzeugen zur Größenbegrenzung bietet das Modul auch einen Dekorator zur Erkennung rekursiver Aufrufe von __repr__() und zum Ersetzen durch einen Platzhalter-String.
- @reprlib.recursive_repr(fillvalue='...')¶
Dekorator für
__repr__()-Methoden zur Erkennung rekursiver Aufrufe innerhalb desselben Threads. Wenn ein rekursiver Aufruf erfolgt, wird der fillvalue zurückgegeben, andernfalls wird der übliche__repr__()-Aufruf ausgeführt. Zum Beispiel>>> 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'>
Hinzugefügt in Version 3.2.
Repr-Objekte¶
Repr-Instanzen stellen mehrere Attribute bereit, die zur Festlegung von Größenbeschränkungen für die Repräsentationen verschiedener Objekttypen verwendet werden können, sowie Methoden, die spezifische Objekttypen formatieren.
- Repr.fillvalue¶
Dieser String wird für rekursive Referenzen angezeigt. Er ist standardmäßig
....Hinzugefügt in Version 3.11.
- Repr.maxlevel¶
Tiefenbeschränkung für die Erstellung rekursiver Repräsentationen. Der Standardwert ist
6.
- Repr.maxdict¶
- Repr.maxlist¶
- Repr.maxtuple¶
- Repr.maxset¶
- Repr.maxfrozenset¶
- Repr.maxdeque¶
- Repr.maxarray¶
Grenzen für die Anzahl der Einträge, die für den benannten Objekttyp repräsentiert werden. Der Standardwert ist
4fürmaxdict,5fürmaxarrayund6für die anderen.
- Repr.maxlong¶
Maximale Anzahl von Zeichen in der Repräsentation für eine Ganzzahl. Ziffern werden aus der Mitte entfernt. Der Standardwert ist
40.
- Repr.maxstring¶
Grenze für die Anzahl der Zeichen in der Repräsentation des Strings. Beachten Sie, dass die "normale" Repräsentation des Strings als Zeichenquelle verwendet wird: Wenn Escape-Sequenzen in der Repräsentation benötigt werden, können diese beim Kürzen der Repräsentation verändert werden. Der Standardwert ist
30.
- Repr.maxother¶
Diese Grenze wird verwendet, um die Größe von Objekttypen zu steuern, für die keine spezifische Formatierungsmethode im
Repr-Objekt verfügbar ist. Sie wird ähnlich wiemaxstringangewendet. Der Standardwert ist20.
- Repr.indent¶
Wenn dieses Attribut auf
None(Standard) gesetzt ist, wird die Ausgabe ohne Zeilenumbrüche oder Einrückungen formatiert, wie die Standardrepr(). Zum Beispiel>>> 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']
Wenn
indentauf einen String gesetzt wird, wird jede Rekursionsebene auf einer eigenen Zeile platziert, eingerückt mit diesem String>>> aRepr.indent = '-->' >>> print(aRepr.repr(example)) [ -->1, -->'spam', -->{ -->-->'a': 2, -->-->'b': 'spam eggs', -->-->'c': { -->-->-->3: 4.5, -->-->-->6: [], -->-->}, -->}, -->'ham', ]
Das Setzen von
indentauf einen positiven ganzzahligen Wert verhält sich so, als ob er auf einen String mit dieser Anzahl von Leerzeichen gesetzt worden wäre>>> aRepr.indent = 4 >>> print(aRepr.repr(example)) [ 1, 'spam', { 'a': 2, 'b': 'spam eggs', 'c': { 3: 4.5, 6: [], }, }, 'ham', ]
Hinzugefügt in Version 3.12.
- Repr.repr(obj)¶
Das Äquivalent zur eingebauten
repr(), das die Formatierung verwendet, die von der Instanz auferlegt wird.
- Repr.repr1(obj, level)¶
Rekursive Implementierung, die von
repr()verwendet wird. Diese verwendet den Typ von obj, um zu bestimmen, welche Formatierungsmethode aufgerufen werden soll, und übergibt obj und level daran. Die typspezifischen Methoden solltenrepr1()aufrufen, um rekursive Formatierung durchzuführen, mitlevel - 1für den Wert von level im rekursiven Aufruf.
- Repr.repr_TYPE(obj, level)
Formatierungsmethoden für spezifische Typen werden als Methoden mit einem Namen implementiert, der auf dem Typnamen basiert. Im Methodennamen wird **TYPE** durch
'_'.join(type(obj).__name__.split())ersetzt. Die Weiterleitung an diese Methoden wird vonrepr1()gehandhabt. Typspezifische Methoden, die einen Wert rekursiv formatieren müssen, solltenself.repr1(subobj, level - 1)aufrufen.
Unterklassen von Repr-Objekten¶
Die Verwendung von dynamischer Weiterleitung durch Repr.repr1() ermöglicht es Unterklassen von Repr, Unterstützung für zusätzliche eingebaute Objekttypen hinzuzufügen oder die Behandlung bereits unterstützter Typen zu ändern. Dieses Beispiel zeigt, wie spezielle Unterstützung für Datei-Objekte hinzugefügt werden könnte
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>