2013-12-11 12 views
6

Dumping ich folgendes Testprogramm habe:automatisch lange Strings verkürzen, wenn sie mit hübschem Druck

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) 

Derzeit ist der Ausgang so etwas wie:

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

In meinen Produktionsdatum, manchmal die Saiten wirklich lang (mehrere tausend Zeichen, kommen von base64 kodierten Anlagen zum Beispiel), und ich möchte nicht, dass meine Protokolle auffüllen. Ich möchte so etwas wie:

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

Das heißt, die String-Werte in der dict mit einer Länge von>max_length muss durch Auslassungszeichen ersetzt werden. Gibt es eine eingebaute Unterstützung in pretty print dafür, oder muss ich eine Kopie des Diktats erstellen, indem ich es manuell gehe und die Zeichenfolgen selbst kürze?

Antwort

8

können Sie die PrettyPrinter Unterklasse und überschreiben die Methode _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) 

Diese Drucke:

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