reprlib
— Alternativ repr()
implementation¶
Källkod: Lib/reprlib.py
Modulen reprlib
ger möjlighet att producera objektrepresentationer med begränsningar av storleken på de strängar som blir resultatet. Detta används i Pythons felsökare och kan vara användbart även i andra sammanhang.
Denna modul tillhandahåller en klass, en instans och en funktion:
- 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)¶
Klass som tillhandahåller formateringstjänster som är användbara vid implementering av funktioner som liknar den inbyggda
repr()
; storleksgränser för olika objekttyper har lagts till för att undvika att representationer genereras som är alltför långa.Nyckelordsargumenten i konstruktorn kan användas som en genväg för att ställa in attributen för
Repr
-instansen. Vilket innebär att följande initialisering:aRepr = reprlib.Repr(maxlevel=3)
Är likvärdig med:
aRepr = reprlib.Repr() aRepr.maxlevel = 3
Se avsnittet Repr Objects för mer information om
Repr
-attribut.Ändrad i version 3.12: Tillåt att attribut ställs in via nyckelordsargument.
- reprlib.aRepr¶
Detta är en instans av
Repr
som används för att tillhandahålla funktionenrepr()
som beskrivs nedan. Om du ändrar attributen för detta objekt påverkas de storleksgränser som används avrepr()
och Pythons debugger.
- reprlib.repr(obj)¶
Detta är
repr()
-metoden föraRepr
. Den returnerar en sträng som liknar den som returneras av den inbyggda funktionen med samma namn, men med begränsningar för de flesta storlekar.
Förutom verktyg för storleksbegränsning innehåller modulen också en dekorator för att upptäcka rekursiva anrop till __repr__()
och ersätta dem med en platshållarsträng.
- @reprlib.recursive_repr(fillvalue='...')¶
Dekorator för
__repr__()
metoder för att upptäcka rekursiva anrop inom samma tråd. Om ett rekursivt anrop görs returneras fillvärdet, annars görs det vanliga__repr__()
-anropet. Ett exempel:>>> 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'>
Tillagd i version 3.2.
Repr-objekt¶
Repr
-instanser innehåller flera attribut som kan användas för att ange storleksgränser för representationer av olika objekttyper och metoder som formaterar specifika objekttyper.
- Repr.fillvalue¶
Denna sträng visas för rekursiva referenser. Standardvärdet är
...
.Tillagd i version 3.11.
- Repr.maxlevel¶
Djupgräns för skapandet av rekursiva representationer. Standardvärdet är
6
.
- Repr.maxdict¶
- Repr.maxlist¶
- Repr.maxtuple¶
- Repr.maxset¶
- Repr.maxfrozenset¶
- Repr.maxdeque¶
- Repr.maxarray¶
Begränsar antalet poster som representeras för den angivna objekttypen. Standardvärdet är
4
förmaxdict
,5
förmaxarray
och6
för de övriga.
- Repr.maxlong¶
Maximalt antal tecken i representationen för ett heltal. Siffrorna tas bort från mitten. Standardvärdet är
40
.
- Repr.maxstring¶
Begränsning av antalet tecken i representationen av strängen. Observera att den ”normala” representationen av strängen används som teckenkälla: om escape-sekvenser behövs i representationen kan dessa manglas när representationen förkortas. Standardvärdet är
30
.
- Repr.maxother¶
Denna gräns används för att kontrollera storleken på objekttyper för vilka ingen specifik formateringsmetod är tillgänglig på
Repr
-objektet. Den tillämpas på liknande sätt sommaxstring
. Standardvärdet är20
.
- Repr.indent¶
Om detta attribut är inställt på
None
(standard) formateras utdata utan radbrytning eller indragning, som standardrepr()
. Ett exempel:>>> 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']
Om
indent
är satt till en sträng placeras varje rekursionsnivå på en egen rad, indragen med strängen:>>> aRepr.indent = '-->' >>> print(aRepr.repr(example)) [ -->1, -->'spam', -->{ -->-->'a': 2, -->-->'b': 'spam eggs', -->-->'c': { -->-->-->3: 4.5, -->-->-->6: [], -->-->}, -->}, -->'ham', ]
Om du anger ett positivt heltalsvärde för
indent
fungerar det som om det hade angetts för en sträng med det antalet mellanslag:>>> aRepr.indent = 4 >>> print(aRepr.repr(example)) [ 1, 'spam', { 'a': 2, 'b': 'spam eggs', 'c': { 3: 4.5, 6: [], }, }, 'ham', ]
Tillagd i version 3.12.
- Repr.repr(obj)¶
Motsvarigheten till den inbyggda
repr()
som använder den formatering som instansen föreskriver.
- Repr.repr1(obj, level)¶
Rekursiv implementering som används av
repr()
. Den använder typen av obj för att avgöra vilken formateringsmetod som ska anropas, och skickar obj och level till den. De typspecifika metoderna bör anroparepr1()
för att utföra rekursiv formatering, medlevel - 1
för värdet på level i det rekursiva anropet.
- Repr.repr_TYPE(obj, level)
Formateringsmetoder för specifika typer implementeras som metoder med ett namn som baseras på typnamnet. I metodnamnet ersätts TYPE med
'_'.join(type(obj).__name__.split())
. Dispatch till dessa metoder hanteras avrepr1()
. Typspecifika metoder som behöver formatera ett värde rekursivt bör anropaself.repr1(subobj, level - 1)
.
Underklassificering av Repr-objekt¶
Användningen av dynamisk dispatching av Repr.repr1()
gör det möjligt för subklasser av Repr
att lägga till stöd för ytterligare inbyggda objekttyper eller att modifiera hanteringen av typer som redan stöds. Detta exempel visar hur specialstöd för filobjekt kan läggas till:
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>