2013-12-11 10 views
6

mam następujący program testowy:Automatycznie skrócić długie ciągi gdy dumping z ładnej druku

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) 

Obecnie wyjście jest coś takiego:

{ 'key-0': 'brnneqgetvanmggyayppxevwcnxvue', 
    'key-1': 'qjzrklrdkykililenwcyhaexuylgub', 
    'key-2': 'ayddiaxhvgxpszutnjdwlgojqaluhr', 
    'key-3': 'rmjpzxrmbogezorigkycqhpsctinzq', 
    'key-4': 'botfczymszkzwuiecyarknnrvwavnr', 
    'key-5': 'norifblhtvfnwblcyeipjmteznylfy', 
    'key-6': 'tiiubgdwxnogdmbafvnujbwpfdopjl', 
    'key-7': 'badgwbrrqunivylutbxqkaeuctrykt', 
    'key-8': 'wulrfkqfqqecxmscayzdbatyispwtu', 
    'key-9': 'gzlwfvjrevlyvbmrvuisnyhhbbwtdd'} 

w moich danych produkcyjnych, czasami struny są naprawdę długi (kilka tysięcy znaków, pochodzących z base64 zakodowanych załączników na przykład), a ja nie chcę, aby wypełniając moje logi. Chciałbym coś takiego:

{ '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...'} 

Oznacza to, że ciąg wartości w dict o długości>max_length muszą być zastąpione wielokropkiem. Czy jest do tego jakieś wsparcie wbudowane w pretty print, czy muszę utworzyć kopię dyktatury ręcznie, przesuwając ją i skracając łańcuchy?

Odpowiedz

8

Można podklasy PrettyPrinter i zastąpić metodę _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) 

Drukuje:

[0, 1, 2] 
'xxxxxxxxxxxxxxxxxxxx...'