自动缩短长串时,与漂亮的普林倾倒

2024-04-23 10:04:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下测试程序:

    from random import choice
    d = { }
    def data(length):
        alphabet = 'abcdefghijklmnopqrstuvwxyz'
        res = ''
        for _ in xrange(length):
            res += choice(alphabet)
        return res
    # Create the test data
    for cnt in xrange(10):
        key = 'key-%d' % (cnt)
        d[key] = data(30)
    def pprint_shorted(d, max_length):
        import pprint
        pp = pprint.PrettyPrinter(indent=4)
        pp.pprint(d)
    pprint_shorted(d, 10)

目前的输出如下:

^{pr2}$

在我的生产数据中,有时字符串的长度是真的长(例如,几千个字符来自base64编码的附件),我不想让它填满我的日志。我想要点像:

{   'key-0': 'brnneqgetv...',
    'key-1': 'qjzrklrdky...',
    'key-2': 'ayddiaxhvg...',
    'key-3': 'rmjpzxrmbo...',
    'key-4': 'botfczymsz...',
    'key-5': 'norifblhtv...',
    'key-6': 'tiiubgdwxn...',
    'key-7': 'badgwbrrqu...',
    'key-8': 'wulrfkqfqq...',
    'key-9': 'gzlwfvjrev...'}

也就是说,dict中长度为>;max_length的字符串值必须替换为省略号。在pretty print中是否有任何内置支持,或者我必须通过手动遍历dict并自己缩短字符串来创建dict的副本?在


Tags: key字符串inimportfordatadefres
1条回答
网友
1楼 · 发布于 2024-04-23 10:04:17

您可以将PrettyPrinter子类化并重写方法_format

import pprint

class P(pprint.PrettyPrinter):
  def _format(self, object, *args, **kwargs):
    if isinstance(object, basestring):
      if len(object) > 20:
        object = object[:20] + '...'
    return pprint.PrettyPrinter._format(self, object, *args, **kwargs)

P().pprint(range(3))
P().pprint('x' * 1000)

打印:

^{pr2}$

相关问题 更多 >