You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

132 lines
4.2 KiB

35 years ago
35 years ago
35 years ago
35 years ago
  1. """Redo the builtin repr() (representation) but with limits on most sizes."""
  2. __all__ = ["Repr","repr"]
  3. import __builtin__
  4. from itertools import islice
  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.maxset = 6
  13. self.maxfrozenset = 6
  14. self.maxdeque = 6
  15. self.maxstring = 30
  16. self.maxlong = 40
  17. self.maxother = 20
  18. def repr(self, x):
  19. return self.repr1(x, self.maxlevel)
  20. def repr1(self, x, level):
  21. typename = type(x).__name__
  22. if ' ' in typename:
  23. parts = typename.split()
  24. typename = '_'.join(parts)
  25. if hasattr(self, 'repr_' + typename):
  26. return getattr(self, 'repr_' + typename)(x, level)
  27. else:
  28. s = __builtin__.repr(x)
  29. if len(s) > self.maxother:
  30. i = max(0, (self.maxother-3)//2)
  31. j = max(0, self.maxother-3-i)
  32. s = s[:i] + '...' + s[len(s)-j:]
  33. return s
  34. def _repr_iterable(self, x, level, left, right, maxiter, trail=''):
  35. n = len(x)
  36. if level <= 0 and n:
  37. s = '...'
  38. else:
  39. newlevel = level - 1
  40. repr1 = self.repr1
  41. pieces = [repr1(elem, newlevel) for elem in islice(x, maxiter)]
  42. if n > maxiter: pieces.append('...')
  43. s = ', '.join(pieces)
  44. if n == 1 and trail: right = trail + right
  45. return '%s%s%s' % (left, s, right)
  46. def repr_tuple(self, x, level):
  47. return self._repr_iterable(x, level, '(', ')', self.maxtuple, ',')
  48. def repr_list(self, x, level):
  49. return self._repr_iterable(x, level, '[', ']', self.maxlist)
  50. def repr_array(self, x, level):
  51. header = "array('%s', [" % x.typecode
  52. return self._repr_iterable(x, level, header, '])', self.maxarray)
  53. def repr_set(self, x, level):
  54. x = _possibly_sorted(x)
  55. return self._repr_iterable(x, level, 'set([', '])', self.maxset)
  56. def repr_frozenset(self, x, level):
  57. x = _possibly_sorted(x)
  58. return self._repr_iterable(x, level, 'frozenset([', '])',
  59. self.maxfrozenset)
  60. def repr_deque(self, x, level):
  61. return self._repr_iterable(x, level, 'deque([', '])', self.maxdeque)
  62. def repr_dict(self, x, level):
  63. n = len(x)
  64. if n == 0: return '{}'
  65. if level <= 0: return '{...}'
  66. newlevel = level - 1
  67. repr1 = self.repr1
  68. pieces = []
  69. for key in islice(_possibly_sorted(x), self.maxdict):
  70. keyrepr = repr1(key, newlevel)
  71. valrepr = repr1(x[key], newlevel)
  72. pieces.append('%s: %s' % (keyrepr, valrepr))
  73. if n > self.maxdict: pieces.append('...')
  74. s = ', '.join(pieces)
  75. return '{%s}' % (s,)
  76. def repr_str(self, x, level):
  77. s = __builtin__.repr(x[:self.maxstring])
  78. if len(s) > self.maxstring:
  79. i = max(0, (self.maxstring-3)//2)
  80. j = max(0, self.maxstring-3-i)
  81. s = __builtin__.repr(x[:i] + x[len(x)-j:])
  82. s = s[:i] + '...' + s[len(s)-j:]
  83. return s
  84. def repr_long(self, x, level):
  85. s = __builtin__.repr(x) # XXX Hope this isn't too slow...
  86. if len(s) > self.maxlong:
  87. i = max(0, (self.maxlong-3)//2)
  88. j = max(0, self.maxlong-3-i)
  89. s = s[:i] + '...' + s[len(s)-j:]
  90. return s
  91. def repr_instance(self, x, level):
  92. try:
  93. s = __builtin__.repr(x)
  94. # Bugs in x.__repr__() can cause arbitrary
  95. # exceptions -- then make up something
  96. except Exception:
  97. return '<%s instance at %x>' % (x.__class__.__name__, id(x))
  98. if len(s) > self.maxstring:
  99. i = max(0, (self.maxstring-3)//2)
  100. j = max(0, self.maxstring-3-i)
  101. s = s[:i] + '...' + s[len(s)-j:]
  102. return s
  103. def _possibly_sorted(x):
  104. # Since not all sequences of items can be sorted and comparison
  105. # functions may raise arbitrary exceptions, return an unsorted
  106. # sequence in that case.
  107. try:
  108. return sorted(x)
  109. except Exception:
  110. return list(x)
  111. aRepr = Repr()
  112. repr = aRepr.repr