Why Pretty Print?
How can I make my class pretty printable in Python? - Stack Overflow
python - How to pretty print nested dictionaries? - Stack Overflow
How to print a list in Python "nicely" - Stack Overflow
What is the advantage of pretty printing a Python dictionary?
What is the pformat function in Python's pprint module?
How to control the indentation in a pretty printed dictionary?
Videos
Hi all
I'm trying to understand the usefulness of Pretty Print.
In automate the boring stuff it was used a few times earlier in the book to make things look 'prettier', it didn't really look much better to me but I assumed this was down to taste.
Now I just saw an actual use-case for it later in the book and it seems like a very convoluted method.
After importing pretty print, the format function can be used to convert a list to a string which makes it easier to write to a text doc and subsequently reimport (apparently). But you can just put 'str' in front of the list to achieve the same thing, so I fail to see the point.
Any ideas?
:\
» pip install prettyprinter
pprint does not look for any hooks. The pprint.PrettyPrinter uses a dispatch pattern instead; a series of methods on the class that are keyed on class.__repr__ references.
You can subclass pprint.PrettyPrinter to teach it about your class:
class YourPrettyPrinter(pprint.PrettyPrinter):
_dispatch = pprint.PrettyPrinter._dispatch.copy()
def _pprint_yourtype(self, object, stream, indent, allowance, context, level):
stream.write('YourType(')
self._format(object.foo, stream, indent, allowance + 1,
context, level)
self._format(object.bar, stream, indent, allowance + 1,
context, level)
stream.write(')')
_dispatch[YourType.__repr__] = _pprint_yourtype
then use the class directly to pretty print data containing YourType instances. Note that this is contingent on the type having their own custom __repr__ method!
You can also plug functions directly into the PrettyPrinter._dispatch dictionary; self is passed in explicitly. This is probably the better option for a 3rd-party library:
from pprint import PrettyPrinter
if isinstance(getattr(PrettyPrinter, '_dispatch'), dict):
# assume the dispatch table method still works
def pprint_ExtendedConfigParser(printer, object, stream, indent, allowance, context, level):
# pretty print it!
PrettyPrinter._dispactch[ExtendedConfigParser.__repr__] = pprint_ExtendedConfigParser
See the pprint module source code for how the other dispatch methods are written.
As always, single-underscore names like _dispatch are internal implementation details that can be altered in a future version. However, it is the best option you have here. The dispatch table was added in Python 3.5 and is present in at least Python 3.5 - 3.9 alpha.
You may want to look at rich, a third-party library that has some great pretty-printing capabilities, and supports hooks (__rich_repr__); see the documentation on customising pretty-printing.
It is not really a solution, but I usually just make objects serializable and pretty print them like this:
pprint(obj.dict())
My first thought was that the JSON serializer is probably pretty good at nested dictionaries, so I'd cheat and use that:
>>> import json
>>> print(json.dumps({'a':2, 'b':{'x':3, 'y':{'t1': 4, 't2':5}}},
... sort_keys=True, indent=4))
{
"a": 2,
"b": {
"x": 3,
"y": {
"t1": 4,
"t2": 5
}
}
}
I'm not sure how exactly you want the formatting to look like, but you could start with a function like this:
def pretty(d, indent=0):
for key, value in d.items():
print('\t' * indent + str(key))
if isinstance(value, dict):
pretty(value, indent+1)
else:
print('\t' * (indent+1) + str(value))