2013-12-11 13 views
6

tôi có chương trình thử nghiệm sau đây:Tự động rút ngắn chuỗi dài khi bán phá giá với in khá

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) 

Hiện nay đầu ra là một cái gì đó như:

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

Trong dữ liệu sản xuất của tôi, đôi khi các dây là thực sự dài (vài nghìn ký tự, đến từ base64 tệp đính kèm được mã hóa chẳng hạn) và tôi không muốn điền các nhật ký của mình. Tôi muốn một cái gì đó như:

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

Đó là, các giá trị chuỗi trong dict với chiều dài>max_length phải được thay thế bằng lược. Có bất kỳ hỗ trợ tích hợp nào trong số pretty print cho điều này hay tôi phải tạo bản sao của dict bằng cách tự đi bộ và tự rút ngắn chuỗi?

Trả lời

8

Bạn có thể phân lớp các PrettyPrinter và ghi đè lên các phương pháp _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) 

in này:

[0, 1, 2] 
'xxxxxxxxxxxxxxxxxxxx...' 
Các vấn đề liên quan