home *** CD-ROM | disk | FTP | other *** search
/ PC World 2005 June / PCWorld_2005-06_cd.bin / software / vyzkuste / firewally / firewally.exe / framework-2.3.exe / repr.py < prev    next >
Text File  |  2003-12-30  |  4KB  |  118 lines

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