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önnen print = pprint.pp neu 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. Wenn None (Standard), wird sys.stdout verwendet.

  • 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. Wenn None (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 auf True gesetzt, was die Schlüssel von Dictionaries automatisch sortieren würde. Möglicherweise möchten Sie stattdessen pp() verwenden, wo es standardmäßig False ist.

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 PrettyPrinter als 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 immer False zurü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 einen RecursionError auslö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, list und tuple oder 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 auf True gesetzt 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.stdout zu schreiben, wenn es None ist.

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 Objekte False zurückgibt. Wenn der Parameter depth des PrettyPrinter gesetzt ist und das Objekt tiefer als erlaubt ist, gibt dies False zurü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ückgabewert True sein. Rekursive Aufrufe der Methode format() sollten zusätzliche Einträge für Container zu diesem Dictionary hinzufügen. Das dritte Argument, maxlevels, gibt die angeforderte Rekursionstiefe an; dies ist 0, 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'}