- 2.1 collectionsContainer Data Types
- 2.2 arraySequence of Fixed-Type Data
- 2.3 heapqHeap Sort Algorithm
- 2.4 bisectMaintain Lists in Sorted Order
- 2.5 QueueThread-Safe FIFO Implementation
- 2.6 structBinary Data Structures
- 2.7 weakrefImpermanent References to Objects
- 2.8 copyDuplicate Objects
- 2.9 pprintPretty-Print Data Structures
2.9 pprint—Pretty-Print Data Structures
- Purpose Pretty-print data structures.
- Python Version 1.4 and later
pprint contains a "pretty printer" for producing aesthetically pleasing views of data structures. The formatter produces representations of data structures that can be parsed correctly by the interpreter and are also easy for a human to read. The output is kept on a single line, if possible, and indented when split across multiple lines.
The examples in this section all depend on pprint_data.py, which contains the following.
data = [ (1, { 'a':'A', 'b':'B', 'c':'C', 'd':'D' }), (2, { 'e':'E', 'f':'F', 'g':'G', 'h':'H', 'i':'I', 'j':'J', 'k':'K', 'l':'L', }), ]
2.9.1 Printing
The simplest way to use the module is through the pprint() function.
from pprint import pprint from pprint_data import data print 'PRINT:' print data print print 'PPRINT:' pprint(data)
pprint() formats an object and writes it to the data stream passed as argument (or sys.stdout by default).
$ python pprint_pprint.py PRINT: [(1, {'a': 'A', 'c': 'C', 'b': 'B', 'd': 'D'}), (2, {'e': 'E', 'g': 'G', 'f': 'F', 'i': 'I', 'h': 'H', 'k': 'K', 'j': 'J', 'l': 'L'})] PPRINT: [(1, {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'}), (2, {'e': 'E', 'f': 'F', 'g': 'G', 'h': 'H', 'i': 'I', 'j': 'J', 'k': 'K', 'l': 'L'})]
2.9.2 Formatting
To format a data structure without writing it directly to a stream (i.e., for logging), use pformat() to build a string representation.
import logging from pprint import pformat from pprint_data import data logging.basicConfig(level=logging.DEBUG, format='%(levelname)-8s %(message)s', ) logging.debug('Logging pformatted data') formatted = pformat(data) for line in formatted.splitlines(): logging.debug(line.rstrip())
The formatted string can then be printed or logged independently.
$ python pprint_pformat.py DEBUG Logging pformatted data DEBUG [(1, {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'}), DEBUG (2, DEBUG {'e': 'E', DEBUG 'f': 'F', DEBUG 'g': 'G', DEBUG 'h': 'H', DEBUG 'i': 'I', DEBUG 'j': 'J', DEBUG 'k': 'K', DEBUG 'l': 'L'})]
2.9.3 Arbitrary Classes
The PrettyPrinter class used by pprint() can also work with custom classes, if they define a __repr__() method.
from pprint import pprint class node(object): def __init__(self, name, contents=[]): self.name = name self.contents = contents[:] def __repr__(self): return ( 'node(' + repr(self.name) + ', ' + repr(self.contents) + ')' ) trees = [ node('node-1'), node('node-2', [ node('node-2-1')]), node('node-3', [ node('node-3-1')]), ] pprint(trees)
The representations of the nested objects are combined by the PrettyPrinter to return the full string representation.
$ python pprint_arbitrary_object.py [node('node-1', []), node('node-2', [node('node-2-1', [])]), node('node-3', [node('node-3-1', [])])]
2.9.4 Recursion
Recursive data structures are represented with a reference to the original source of the data, with the form <Recursion on typename with id=number>.
from pprint import pprint local_data = [ 'a', 'b', 1, 2 ] local_data.append(local_data) print 'id(local_data) =>', id(local_data) pprint(local_data)
In this example, the list local_data is added to itself, creating a recursive reference.
$ python pprint_recursion.py id(local_data) => 4309215280 ['a', 'b', 1, 2, <Recursion on list with id=4309215280>]
2.9.5 Limiting Nested Output
For very deep data structures, it may not be desirable for the output to include all details. The data may not format properly, the formatted text might be too large to manage, or some of the data may be extraneous.
from pprint import pprint from pprint_data import data pprint(data, depth=1)
Use the depth argument to control how far down into the nested data structure the pretty printer recurses. Levels not included in the output are represented by an ellipsis.
$ python pprint_depth.py [(...), (...)]
2.9.6 Controlling Output Width
The default output width for the formatted text is 80 columns. To adjust that width, use the width argument to pprint().
from pprint import pprint from pprint_data import data for width in [ 80, 5 ]: print 'WIDTH =', width pprint(data, width=width) print
When the width is too low to accommodate the formatted data structure, the lines are not truncated or wrapped if that would introduce invalid syntax.
$ python pprint_width.py WIDTH = 80 [(1, {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'}), (2, {'e': 'E', 'f': 'F', 'g': 'G', 'h': 'H', 'i': 'I', 'j': 'J', 'k': 'K', 'l': 'L'})] WIDTH = 5 [(1, {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'}), (2, {'e': 'E', 'f': 'F', 'g': 'G', 'h': 'H', 'i': 'I', 'j': 'J', 'k': 'K', 'l': 'L'})]
See Also:
- pprint (http://docs.python.org/lib/module-pprint.html) Standard library documentation for this module.