home *** CD-ROM | disk | FTP | other *** search
/ H4CK3R 14 / hacker14.iso / programacao / pythonwin / python.exe / REPR.PY < prev    next >
Encoding:
Python Source  |  2003-02-05  |  3.7 KB  |  114 lines

  1. """Redo the `...` (representation) but with limits on most sizes."""
  2.  
  3. __all__ = ["Repr","repr"]
  4.  
  5. class Repr:
  6.     def __init__(self):
  7.         self.maxlevel = 6
  8.         self.maxtuple = 6
  9.         self.maxlist = 6
  10.         self.maxarray = 5
  11.         self.maxdict = 4
  12.         self.maxstring = 30
  13.         self.maxlong = 40
  14.         self.maxother = 20
  15.     def repr(self, x):
  16.         return self.repr1(x, self.maxlevel)
  17.     def repr1(self, x, level):
  18.         typename = type(x).__name__
  19.         if ' ' in typename:
  20.             parts = typename.split()
  21.             typename = '_'.join(parts)
  22.         if hasattr(self, 'repr_' + typename):
  23.             return getattr(self, 'repr_' + typename)(x, level)
  24.         else:
  25.             s = `x`
  26.             if len(s) > self.maxother:
  27.                 i = max(0, (self.maxother-3)//2)
  28.                 j = max(0, self.maxother-3-i)
  29.                 s = s[:i] + '...' + s[len(s)-j:]
  30.             return s
  31.     def repr_tuple(self, x, level):
  32.         n = len(x)
  33.         if n == 0: return '()'
  34.         if level <= 0: return '(...)'
  35.         s = ''
  36.         for i in range(min(n, self.maxtuple)):
  37.             if s: s = s + ', '
  38.             s = s + self.repr1(x[i], level-1)
  39.         if n > self.maxtuple: s = s + ', ...'
  40.         elif n == 1: s = s + ','
  41.         return '(' + s + ')'
  42.     def repr_list(self, x, level):
  43.         n = len(x)
  44.         if n == 0: return '[]'
  45.         if level <= 0: return '[...]'
  46.         s = ''
  47.         for i in range(min(n, self.maxlist)):
  48.             if s: s = s + ', '
  49.             s = s + self.repr1(x[i], level-1)
  50.         if n > self.maxlist: s = s + ', ...'
  51.         return '[' + s + ']'
  52.  
  53.     def repr_array(self, x, level):
  54.         n = len(x)
  55.         header = "array('%s', [" % x.typecode
  56.         if n == 0:
  57.             return header + "])"
  58.         if level <= 0:
  59.             return header + "...])"
  60.         s = ''
  61.         for i in range(min(n, self.maxarray)):
  62.             if s:
  63.                 s += ', '
  64.             s += self.repr1(x[i], level-1)
  65.         if n > self.maxarray:
  66.             s += ', ...'
  67.         return header + s + "])"
  68.  
  69.     def repr_dict(self, x, level):
  70.         n = len(x)
  71.         if n == 0: return '{}'
  72.         if level <= 0: return '{...}'
  73.         s = ''
  74.         keys = x.keys()
  75.         keys.sort()
  76.         for i in range(min(n, self.maxdict)):
  77.             if s: s = s + ', '
  78.             key = keys[i]
  79.             s = s + self.repr1(key, level-1)
  80.             s = s + ': ' + self.repr1(x[key], level-1)
  81.         if n > self.maxdict: s = s + ', ...'
  82.         return '{' + s + '}'
  83.     def repr_str(self, x, level):
  84.         s = `x[:self.maxstring]`
  85.         if len(s) > self.maxstring:
  86.             i = max(0, (self.maxstring-3)//2)
  87.             j = max(0, self.maxstring-3-i)
  88.             s = `x[:i] + x[len(x)-j:]`
  89.             s = s[:i] + '...' + s[len(s)-j:]
  90.         return s
  91.     def repr_long(self, x, level):
  92.         s = `x` # XXX Hope this isn't too slow...
  93.         if len(s) > self.maxlong:
  94.             i = max(0, (self.maxlong-3)//2)
  95.             j = max(0, self.maxlong-3-i)
  96.             s = s[:i] + '...' + s[len(s)-j:]
  97.         return s
  98.     def repr_instance(self, x, level):
  99.         try:
  100.             s = `x`
  101.             # Bugs in x.__repr__() can cause arbitrary
  102.             # exceptions -- then make up something
  103.         except:
  104.             return '<' + x.__class__.__name__ + ' instance at ' + \
  105.                       hex(id(x))[2:] + '>'
  106.         if len(s) > self.maxstring:
  107.             i = max(0, (self.maxstring-3)//2)
  108.             j = max(0, self.maxstring-3-i)
  109.             s = s[:i] + '...' + s[len(s)-j:]
  110.         return s
  111.  
  112. aRepr = Repr()
  113. repr = aRepr.repr
  114.