Any way to properly pretty-print ordered dictionaries?

后端 未结 15 1492
春和景丽
春和景丽 2020-12-07 14:34

I like the pprint module in Python. I use it a lot for testing and debugging. I frequently use the width option to make sure the output fits nicely within my terminal window

15条回答
  •  春和景丽
    2020-12-07 14:56

    Here's another answer that works by overriding and using the stock pprint() function internally. Unlike my earlier one it will handle OrderedDict's inside another container such as a list and should also be able to handle any optional keyword arguments given — however it does not have the same degree of control over the output that the other one afforded.

    It operates by redirecting the stock function's output into a temporary buffer and then word wraps that before sending it on to the output stream. While the final output produced isn't exceptionalily pretty, it's decent and may be "good enough" to use as a workaround.

    Update 2.0

    Simplified by using standard library textwrap module, and modified to work in both Python 2 & 3.

    from collections import OrderedDict
    try:
        from cStringIO import StringIO
    except ImportError:  # Python 3
        from io import StringIO
    from pprint import pprint as pp_pprint
    import sys
    import textwrap
    
    def pprint(object, **kwrds):
        try:
            width = kwrds['width']
        except KeyError: # unlimited, use stock function
            pp_pprint(object, **kwrds)
            return
        buffer = StringIO()
        stream = kwrds.get('stream', sys.stdout)
        kwrds.update({'stream': buffer})
        pp_pprint(object, **kwrds)
        words = buffer.getvalue().split()
        buffer.close()
    
        # word wrap output onto multiple lines <= width characters
        try:
            print >> stream, textwrap.fill(' '.join(words), width=width)
        except TypeError:  # Python 3
            print(textwrap.fill(' '.join(words), width=width), file=stream)
    
    d = dict((('john',1), ('paul',2), ('mary',3)))
    od = OrderedDict((('john',1), ('paul',2), ('mary',3)))
    lod = [OrderedDict((('john',1), ('paul',2), ('mary',3))),
           OrderedDict((('moe',1), ('curly',2), ('larry',3))),
           OrderedDict((('weapons',1), ('mass',2), ('destruction',3)))]
    

    Sample output:

    pprint(d, width=40)
    

    »   {'john': 1, 'mary': 3, 'paul': 2}

    pprint(od, width=40)
    

    » OrderedDict([('john', 1), ('paul', 2),
       ('mary', 3)])

    pprint(lod, width=40)
    

    » [OrderedDict([('john', 1), ('paul', 2),
       ('mary', 3)]), OrderedDict([('moe', 1),
       ('curly', 2), ('larry', 3)]),
       OrderedDict([('weapons', 1), ('mass',
       2), ('destruction', 3)])]

提交回复
热议问题