在pprint输出中禁用排序机制

发布于 2021-01-29 14:58:55

我有一个正在打印的大词典,可以用prettyprint查看,但是如何保持格式但又不能杀死pprint中的排序机制?

关注者
0
被浏览
90
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您可以猴子修补pprint模块。

    import pprint
    
    pprint.pprint({"def":2,"ghi":3,"abc":1,})
    pprint._sorted = lambda x:x
    # Or, for Python 3.7:
    # pprint.sorted = lambda x, key=None: x
    pprint.pprint({"def":2,"ghi":3, "abc":1})
    

    由于第二个输出基本上是随机排序的,因此您的输出可能与我的不同:

    {'abc': 1, 'def': 2, 'ghi': 3}
    {'abc': 1, 'ghi': 3, 'def': 2}
    

    另一个版本更复杂,但更易于使用:

    import pprint
    import contextlib
    
    @contextlib.contextmanager
    def pprint_nosort():
        # Note: the pprint implementation changed somewhere
        # between 2.7.12 and 3.7.0. This is the danger of
        # monkeypatching!
        try:
            # Old pprint
            orig,pprint._sorted = pprint._sorted, lambda x:x
        except AttributeError:
            # New pprint
            import builtins
            orig,pprint.sorted = None, lambda x, key=None:x
    
        try:
            yield
        finally:
            if orig:
                pprint._sorted = orig
            else:
                del pprint.sorted
    
    # For times when you don't want sorted output
    with pprint_nosort():
        pprint.pprint({"def":2,"ghi":3, "abc":1})
    
    # For times when you do want sorted output
    pprint.pprint({"def":2,"ghi":3, "abc":1})
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看