pprint — Data pretty printer

Källkod: Lib/pprint.py


Modulen pprint ger möjlighet att ”pretty-printa” godtyckliga Python-datastrukturer i en form som kan användas som indata till tolken. Om de formaterade strukturerna innehåller objekt som inte är grundläggande Python-typer, kan det hända att representationen inte är inläsbar. Detta kan vara fallet om objekt som filer, sockets eller klasser ingår, liksom många andra objekt som inte kan representeras som Python-litteraler.

Den formaterade representationen håller objekten på en enda rad om det är möjligt och delar upp dem på flera rader om de inte ryms inom den tillåtna bredden, som kan justeras med parametern width och som standard är 80 tecken.

Ordböckerna sorteras efter nyckel innan visningen beräknas.

Ändrad i version 3.9: Lagt till stöd för pretty-printing av types.SimpleNamespace.

Ändrad i version 3.10: Lagt till stöd för pretty-printing dataclasses.dataclass.

Funktioner

pprint.pp(object, stream=None, indent=1, width=80, depth=None, *, compact=False, sort_dicts=False, underscore_numbers=False)

Skriver ut den formaterade representationen av object, följt av en ny rad. Denna funktion kan användas i den interaktiva tolken i stället för print()-funktionen för att inspektera värden. Tips: Du kan omfördela print = pprint.pp för användning inom ett scope.

Parametrar:
  • object – Det objekt som ska skrivas ut.

  • stream (file-like object | None) – Ett filliknande objekt till vilket utdata skrivs genom att anropa dess write()-metod. Om None (standard) används sys.stdout.

  • indent (int) – Den mängd indrag som läggs till för varje nestningsnivå.

  • width (int) – Det önskade maximala antalet tecken per rad i utdata. Om en struktur inte kan formateras inom breddbegränsningen görs ett försök att göra det.

  • depth (int | None) – Antalet nestningsnivåer som kan skrivas ut. Om datastrukturen som skrivs ut är för djup, ersätts nästa nivå med .... Om None (standard) finns det ingen begränsning av djupet på de objekt som formateras.

  • compact (bool) – Styr hur långa sekvenser formateras. Om False (standard) formateras varje objekt i en sekvens på en separat rad, annars formateras så många objekt som ryms inom bredden på varje utdatarad.

  • sort_dicts (bool) – Om True, formateras ordböcker med nycklarna sorterade, annars visas de i inmatningsordning (standard).

  • underscore_numbers (bool) – Om True formateras heltal med tecknet _ som tusentalsavgränsare, annars visas inte understrykningar (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']

Tillagd i 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() med sort_dicts satt till True som standard, vilket automatiskt sorterar nycklarna i ordböckerna, du kanske vill använda pp() istället där det är False som standard.

pprint.pformat(object, indent=1, width=80, depth=None, *, compact=False, sort_dicts=True, underscore_numbers=False)

Returnerar den formaterade representationen av object som en sträng. indent, width, depth, compact, sort_dicts och underscore_numbers skickas till PrettyPrinter-konstruktören som formateringsparametrar och deras betydelser beskrivs i dokumentationen ovan.

pprint.isreadable(object)

Avgör om den formaterade representationen av objekt är ”läsbar” eller kan användas för att rekonstruera värdet med hjälp av eval(). Detta returnerar alltid False för rekursiva objekt.

>>> pprint.isreadable(stuff)
False
pprint.isrecursive(object)

Avgör om objektet kräver en rekursiv representation. Denna funktion är underkastad samma begränsningar som anges i saferepr() nedan och kan ge upphov till ett RecursionError om den misslyckas med att upptäcka ett rekursivt objekt.

pprint.saferepr(object)

Returnerar en strängrepresentation av object, skyddad mot rekursion i vissa vanliga datastrukturer, nämligen instanser av dict, list och tuple eller underklasser vars __repr__ inte har åsidosatts. Om representationen av objektet innehåller en rekursiv post, kommer den rekursiva referensen att representeras som <Recursion on typename with id=number>. Representationen är inte formaterad på något annat sätt.

>>> pprint.saferepr(stuff)
"[<Recursion on list with id=...>, 'spam', 'eggs', 'lumberjack', 'knights', 'ni']"

PrettyPrinter-objekt

class pprint.PrettyPrinter(indent=1, width=80, depth=None, stream=None, *, compact=False, sort_dicts=True, underscore_numbers=False)

Konstruera en instans av PrettyPrinter.

Argumenten har samma betydelse som för pp(). Observera att de är i en annan ordning och att sort_dicts som standard är True.

>>> 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', (...)))))))

Ändrad i version 3.4: Parametern kompakt har lagts till.

Ändrad i version 3.8: Parametern sort_dicts har lagts till.

Ändrad i version 3.10: Parametern underscore_numbers har lagts till.

Ändrad i version 3.11: Försöker inte längre skriva till sys.stdout om den är None.

PrettyPrinter-instanser har följande metoder:

PrettyPrinter.pformat(object)

Returnerar den formaterade representationen av objekt. Detta tar hänsyn till de alternativ som skickas till PrettyPrinter-konstruktören.

PrettyPrinter.pprint(object)

Skriv ut den formaterade representationen av objektet i den konfigurerade strömmen, följt av en ny rad.

Följande metoder ger implementationer för motsvarande funktioner med samma namn. Att använda dessa metoder på en instans är något mer effektivt eftersom nya PrettyPrinter-objekt inte behöver skapas.

PrettyPrinter.isreadable(object)

Avgör om den formaterade representationen av objektet är ”läsbar” eller kan användas för att rekonstruera värdet med hjälp av eval(). Observera att detta returnerar False för rekursiva objekt. Om parametern depth i PrettyPrinter är inställd och objektet är djupare än tillåtet, returnerar detta False.

PrettyPrinter.isrecursive(object)

Bestäm om objektet kräver en rekursiv representation.

Denna metod tillhandahålls som en hook för att tillåta underklasser att ändra sättet som objekt konverteras till strängar. Standardimplementeringen använder det interna i saferepr()-implementeringen.

PrettyPrinter.format(object, context, maxlevels, level)

Returnerar tre värden: den formaterade versionen av object som en sträng, en flagga som anger om resultatet är läsbart och en flagga som anger om rekursion upptäcktes. Det första argumentet är det objekt som ska presenteras. Det andra är en ordbok som innehåller id() för objekt som ingår i det aktuella presentationssammanhanget (direkta och indirekta behållare för objekt som påverkar presentationen) som nycklar; om ett objekt behöver presenteras som redan finns representerat i context, ska det tredje returvärdet vara True. Rekursiva anrop till metoden format() bör lägga till ytterligare poster för containrar i denna ordbok. Det tredje argumentet, maxlevels, ger den begärda gränsen för rekursion; detta kommer att vara 0 om det inte finns någon begärd gräns. Detta argument bör skickas oförändrat till rekursiva anrop. Det fjärde argumentet, level, anger den aktuella nivån; rekursiva anrop bör ges ett värde som är lägre än det aktuella anropets.

Exempel

För att demonstrera flera användningsområden för funktionen pp() och dess parametrar, låt oss hämta information om ett projekt från 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']

I sin grundform visar pp() hela objektet:

>>> 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'}

Resultatet kan begränsas till ett visst djup (ellips används för djupare innehåll):

>>> 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'}

Dessutom kan maximal teckenbredd* föreslås. Om ett långt objekt inte kan delas kommer den angivna bredden att överskridas:

>>> 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'}