How to limit *length* of PrettyPrinter
On 7/22/20 1:31 PM, Stavros Macrakis wrote:
> I see how to limit the *depth* in pretty-printing:
> import pprint
> ((11, 12, 13),
> (21, 22, 23, (...), 25, 26, 27))
> But I would also like to limit the *length, *something like this:
> ((11, 12, 13),
> (21, 22, 23, (...), ...)) # Only show first 4 elements
> How can I do that?
That's 'a bit of an ask' given that the four elements could be of any
data-type (object)! Secondly, I'm having difficulty working-out how you
wish to define "element".
1 Limit the input:
If you know the input, in the example it is nested tuple, then it would
be trivial to slice the collection *before* passing to pprint, eg
>>> t = ( 1, 2, 3, 4 )
>>> t[ :2 ]
>>> pprint.pprint( t[ :2 ] )
However, if the second element were an embedded collection, then that
idea suffers a similar short-coming to the existing depth parameter!
That said, if you also know the hierarchy, you could get really clever
with a recursive function which 'pops' the first element from any given
hierarchical construct, to the required number of elements. Sounds like
a 'fun' (ie dastardly) project to assign coding trainees!
(this list doesn't accept graphic attachments otherwise I'd demonstrate
my vicious grin...)
PS should you try this, would welcome a copy (off-list).
2 Limit the output:
Remember that the signature is:
class pprint.PrettyPrinter(indent=1, width=80, depth=None,
stream=None, *, compact=False,
How about capturing the stream output? Could you then post-process that
by counting commas!
NB I have never tried capturing the stream o/p!
- or if you really want to 'go nuts', dust-off your polish notation and
count opening and closing parentheses as well...
One has to wonder though, why not grab the output stream and print only
the first n-characters? (on the grounds that 'close-enough is
good-enough'. However, it's your spec...)