pprint — Data pretty printer¶
Source Code: Lib/pprint.py
Das Modul pprint bietet die Möglichkeit, beliebige Python-Datenstrukturen "hübsch" (pretty-print) auszugeben, und zwar in einem Format, das als Eingabe für den Interpreter verwendet werden kann. Wenn die formatierten Strukturen Objekte enthalten, die keine grundlegenden Python-Typen sind, ist die Darstellung möglicherweise nicht ladbar. Dies kann der Fall sein, wenn Objekte wie Dateien, Sockets oder Klassen enthalten sind, sowie viele andere Objekte, die nicht als Python-Literale darstellbar sind.
Die formatierte Darstellung behält Objekte nach Möglichkeit in einer einzigen Zeile und bricht sie auf mehrere Zeilen um, wenn sie nicht in die zulässige Breite passen, die durch den Parameter width, standardmäßig 80 Zeichen, eingestellt werden kann.
Geändert in Version 3.9: Unterstützung für das Pretty-Printing von types.SimpleNamespace hinzugefügt.
Geändert in Version 3.10: Unterstützung für das Pretty-Printing von dataclasses.dataclass hinzugefügt.
Funktionen¶
- pprint.pp(object, stream=None, indent=1, width=80, depth=None, *, compact=False, sort_dicts=False, underscore_numbers=False)¶
Gibt die formatierte Darstellung von object aus, gefolgt von einem Zeilenumbruch. Diese Funktion kann im interaktiven Interpreter anstelle der Funktion
print()zur Inspektion von Werten verwendet werden. Tipp: Sie könnenprint = pprint.ppneu zuweisen, um sie innerhalb eines Geltungsbereichs zu verwenden.- Parameter:
object – Das auszugebende Objekt.
stream (file-like object | None) – Ein dateiähnliches Objekt, in das die Ausgabe durch Aufruf seiner
write()-Methode geschrieben wird. WennNone(Standard), wirdsys.stdoutverwendet.indent (int) – Der Einrückungsbetrag, der für jede Verschachtelungsebene hinzugefügt wird.
width (int) – Die gewünschte maximale Anzahl von Zeichen pro Zeile in der Ausgabe. Wenn eine Struktur nicht innerhalb der Breitenbeschränkung formatiert werden kann, wird eine bestmögliche Anstrengung unternommen.
depth (int | None) – Die Anzahl der Verschachtelungsebenen, die ausgegeben werden können. Wenn die zu druckende Datenstruktur zu tief ist, wird die nächste enthaltene Ebene durch
...ersetzt. WennNone(Standard), gibt es keine Beschränkung für die Tiefe der zu formatierenden Objekte.compact (bool) – Steuert die Art und Weise, wie lange Sequenzen formatiert werden. Wenn
False(Standard), wird jedes Element einer Sequenz in einer separaten Zeile formatiert, andernfalls werden so viele Elemente wie in die width passen, in jeder Ausgabenzeile formatiert.sort_dicts (bool) – Wenn
True, werden Dictionaries mit sortierten Schlüsseln formatiert, andernfalls werden sie in der Einfügungsreihenfolge angezeigt (Standard).underscore_numbers (bool) – Wenn
True, werden ganze Zahlen mit dem Zeichen_als Tausendertrennzeichen formatiert, andernfalls werden Unterstriche nicht angezeigt (Standard).
>>> import pprint >>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni'] >>> stuff.insert(0, stuff) >>> pprint.pp(stuff) [<Recursion on list with id=...>, 'spam', 'eggs', 'lumberjack', 'knights', 'ni']
Hinzugefügt in Version 3.8.
- pprint.pprint(object, stream=None, indent=1, width=80, depth=None, *, compact=False, sort_dicts=True, underscore_numbers=False)¶
Alias für
pp()mit sort_dicts standardmäßig aufTruegesetzt, was die Schlüssel von Dictionaries automatisch sortieren würde. Möglicherweise möchten Sie stattdessenpp()verwenden, wo es standardmäßigFalseist.
- pprint.pformat(object, indent=1, width=80, depth=None, *, compact=False, sort_dicts=True, underscore_numbers=False)¶
Gibt die formatierte Darstellung von object als String zurück. indent, width, depth, compact, sort_dicts und underscore_numbers werden an den Konstruktor von
PrettyPrinterals Formatierungsparameter übergeben, und ihre Bedeutungen sind wie in der obigen Dokumentation beschrieben.
- pprint.isreadable(object)¶
Ermittelt, ob die formatierte Darstellung von object "lesbar" ist oder ob sie verwendet werden kann, um den Wert mit
eval()zu rekonstruieren. Dies gibt für rekursive Objekte immerFalsezurück.>>> pprint.isreadable(stuff) False
- pprint.isrecursive(object)¶
Ermittelt, ob object eine rekursive Darstellung erfordert. Diese Funktion unterliegt denselben Einschränkungen wie in
saferepr()unten beschrieben und kann einenRecursionErrorauslösen, wenn sie ein rekursives Objekt nicht erkennen kann.
- pprint.saferepr(object)¶
Gibt eine String-Darstellung von object zurück, geschützt gegen Rekursion in einigen gängigen Datenstrukturen, nämlich Instanzen von
dict,listundtupleoder Unterklassen, deren__repr__nicht überschrieben wurde. Wenn die Darstellung von object einen rekursiven Eintrag aufweist, wird die rekursive Referenz als<Recursion on typename with id=number>dargestellt. Die Darstellung wird nicht anderweitig formatiert.>>> pprint.saferepr(stuff) "[<Recursion on list with id=...>, 'spam', 'eggs', 'lumberjack', 'knights', 'ni']"
PrettyPrinter-Objekte¶
- class pprint.PrettyPrinter(indent=1, width=80, depth=None, stream=None, *, compact=False, sort_dicts=True, underscore_numbers=False)¶
Konstruiert eine Instanz von
PrettyPrinter.Die Argumente haben dieselbe Bedeutung wie für
pp(). Beachten Sie, dass sie in einer anderen Reihenfolge sind und sort_dicts standardmäßig aufTruegesetzt ist.>>> import pprint >>> stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni'] >>> stuff.insert(0, stuff[:]) >>> pp = pprint.PrettyPrinter(indent=4) >>> pp.pprint(stuff) [ ['spam', 'eggs', 'lumberjack', 'knights', 'ni'], 'spam', 'eggs', 'lumberjack', 'knights', 'ni'] >>> pp = pprint.PrettyPrinter(width=41, compact=True) >>> pp.pprint(stuff) [['spam', 'eggs', 'lumberjack', 'knights', 'ni'], 'spam', 'eggs', 'lumberjack', 'knights', 'ni'] >>> tup = ('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead', ... ('parrot', ('fresh fruit',)))))))) >>> pp = pprint.PrettyPrinter(depth=6) >>> pp.pprint(tup) ('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead', (...)))))))
Geändert in Version 3.4: Der Parameter compact wurde hinzugefügt.
Geändert in Version 3.8: Der Parameter sort_dicts wurde hinzugefügt.
Geändert in Version 3.10: Der Parameter underscore_numbers wurde hinzugefügt.
Geändert in Version 3.11: Versucht nicht mehr, nach
sys.stdoutzu schreiben, wenn esNoneist.
PrettyPrinter-Instanzen haben folgende Methoden
- PrettyPrinter.pformat(object)¶
Gibt die formatierte Darstellung von object zurück. Dies berücksichtigt die Optionen, die an den Konstruktor von
PrettyPrinterübergeben wurden.
- PrettyPrinter.pprint(object)¶
Gibt die formatierte Darstellung von object auf dem konfigurierten Stream aus, gefolgt von einem Zeilenumbruch.
Die folgenden Methoden stellen die Implementierungen für die entsprechenden Funktionen mit demselben Namen bereit. Die Verwendung dieser Methoden bei einer Instanz ist etwas effizienter, da keine neuen PrettyPrinter-Objekte erstellt werden müssen.
- PrettyPrinter.isreadable(object)¶
Ermittelt, ob die formatierte Darstellung des Objekts "lesbar" ist oder ob sie verwendet werden kann, um den Wert mit
eval()zu rekonstruieren. Beachten Sie, dass dies für rekursive ObjekteFalsezurückgibt. Wenn der Parameter depth desPrettyPrintergesetzt ist und das Objekt tiefer als erlaubt ist, gibt diesFalsezurück.
- PrettyPrinter.isrecursive(object)¶
Ermittelt, ob das Objekt eine rekursive Darstellung erfordert.
Diese Methode wird als Hook bereitgestellt, um Unterklassen die Möglichkeit zu geben, die Art und Weise, wie Objekte in Strings umgewandelt werden, zu ändern. Die Standardimplementierung verwendet die internen Mechanismen der Implementierung von saferepr().
- PrettyPrinter.format(object, context, maxlevels, level)¶
Gibt drei Werte zurück: die formatierte Version von object als String, ein Flag, das angibt, ob das Ergebnis lesbar ist, und ein Flag, das angibt, ob eine Rekursion erkannt wurde. Das erste Argument ist das darzustellende Objekt. Das zweite ist ein Dictionary, das die
id()von Objekten enthält, die Teil des aktuellen Darstellungskontextes sind (direkte und indirekte Container für object, die die Darstellung beeinflussen) als Schlüssel; wenn ein Objekt dargestellt werden muss, das bereits in context dargestellt ist, sollte der dritte RückgabewertTruesein. Rekursive Aufrufe der Methodeformat()sollten zusätzliche Einträge für Container zu diesem Dictionary hinzufügen. Das dritte Argument, maxlevels, gibt die angeforderte Rekursionstiefe an; dies ist0, wenn keine Anforderung besteht. Dieses Argument sollte unverändert an rekursive Aufrufe übergeben werden. Das vierte Argument, level, gibt die aktuelle Ebene an; rekursive Aufrufe sollten einen Wert kleiner als der des aktuellen Aufrufs erhalten.
Beispiel¶
Um verschiedene Verwendungen der Funktion pp() und ihrer Parameter zu demonstrieren, holen wir Informationen über ein Projekt von PyPI
>>> import json
>>> import pprint
>>> from urllib.request import urlopen
>>> with urlopen('https://pypi.org/pypi/sampleproject/1.2.0/json') as resp:
... project_info = json.load(resp)['info']
In seiner Grundform zeigt pp() das gesamte Objekt an
>>> pprint.pp(project_info)
{'author': 'The Python Packaging Authority',
'author_email': 'pypa-dev@googlegroups.com',
'bugtrack_url': None,
'classifiers': ['Development Status :: 3 - Alpha',
'Intended Audience :: Developers',
'License :: OSI Approved :: MIT License',
'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.6',
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.2',
'Programming Language :: Python :: 3.3',
'Programming Language :: Python :: 3.4',
'Topic :: Software Development :: Build Tools'],
'description': 'A sample Python project\n'
'=======================\n'
'\n'
'This is the description file for the project.\n'
'\n'
'The file should use UTF-8 encoding and be written using '
'ReStructured Text. It\n'
'will be used to generate the project webpage on PyPI, and '
'should be written for\n'
'that purpose.\n'
'\n'
'Typical contents for this file would include an overview of '
'the project, basic\n'
'usage examples, etc. Generally, including the project '
'changelog in here is not\n'
'a good idea, although a simple "What\'s New" section for the '
'most recent version\n'
'may be appropriate.',
'description_content_type': None,
'docs_url': None,
'download_url': 'UNKNOWN',
'downloads': {'last_day': -1, 'last_month': -1, 'last_week': -1},
'home_page': 'https://github.com/pypa/sampleproject',
'keywords': 'sample setuptools development',
'license': 'MIT',
'maintainer': None,
'maintainer_email': None,
'name': 'sampleproject',
'package_url': 'https://pypi.org/project/sampleproject/',
'platform': 'UNKNOWN',
'project_url': 'https://pypi.org/project/sampleproject/',
'project_urls': {'Download': 'UNKNOWN',
'Homepage': 'https://github.com/pypa/sampleproject'},
'release_url': 'https://pypi.org/project/sampleproject/1.2.0/',
'requires_dist': None,
'requires_python': None,
'summary': 'A sample Python project',
'version': '1.2.0'}
Das Ergebnis kann auf eine bestimmte Tiefe begrenzt werden (für tiefere Inhalte wird Ellipse verwendet)
>>> pprint.pp(project_info, depth=1)
{'author': 'The Python Packaging Authority',
'author_email': 'pypa-dev@googlegroups.com',
'bugtrack_url': None,
'classifiers': [...],
'description': 'A sample Python project\n'
'=======================\n'
'\n'
'This is the description file for the project.\n'
'\n'
'The file should use UTF-8 encoding and be written using '
'ReStructured Text. It\n'
'will be used to generate the project webpage on PyPI, and '
'should be written for\n'
'that purpose.\n'
'\n'
'Typical contents for this file would include an overview of '
'the project, basic\n'
'usage examples, etc. Generally, including the project '
'changelog in here is not\n'
'a good idea, although a simple "What\'s New" section for the '
'most recent version\n'
'may be appropriate.',
'description_content_type': None,
'docs_url': None,
'download_url': 'UNKNOWN',
'downloads': {...},
'home_page': 'https://github.com/pypa/sampleproject',
'keywords': 'sample setuptools development',
'license': 'MIT',
'maintainer': None,
'maintainer_email': None,
'name': 'sampleproject',
'package_url': 'https://pypi.org/project/sampleproject/',
'platform': 'UNKNOWN',
'project_url': 'https://pypi.org/project/sampleproject/',
'project_urls': {...},
'release_url': 'https://pypi.org/project/sampleproject/1.2.0/',
'requires_dist': None,
'requires_python': None,
'summary': 'A sample Python project',
'version': '1.2.0'}
Zusätzlich kann eine maximale Zeichenbreite width vorgeschlagen werden. Wenn ein langes Objekt nicht aufgeteilt werden kann, wird die angegebene Breite überschritten
>>> pprint.pp(project_info, depth=1, width=60)
{'author': 'The Python Packaging Authority',
'author_email': 'pypa-dev@googlegroups.com',
'bugtrack_url': None,
'classifiers': [...],
'description': 'A sample Python project\n'
'=======================\n'
'\n'
'This is the description file for the '
'project.\n'
'\n'
'The file should use UTF-8 encoding and be '
'written using ReStructured Text. It\n'
'will be used to generate the project '
'webpage on PyPI, and should be written '
'for\n'
'that purpose.\n'
'\n'
'Typical contents for this file would '
'include an overview of the project, '
'basic\n'
'usage examples, etc. Generally, including '
'the project changelog in here is not\n'
'a good idea, although a simple "What\'s '
'New" section for the most recent version\n'
'may be appropriate.',
'description_content_type': None,
'docs_url': None,
'download_url': 'UNKNOWN',
'downloads': {...},
'home_page': 'https://github.com/pypa/sampleproject',
'keywords': 'sample setuptools development',
'license': 'MIT',
'maintainer': None,
'maintainer_email': None,
'name': 'sampleproject',
'package_url': 'https://pypi.org/project/sampleproject/',
'platform': 'UNKNOWN',
'project_url': 'https://pypi.org/project/sampleproject/',
'project_urls': {...},
'release_url': 'https://pypi.org/project/sampleproject/1.2.0/',
'requires_dist': None,
'requires_python': None,
'summary': 'A sample Python project',
'version': '1.2.0'}