added deeptype, fixed itype for class instances, added maxLen=None for fastRepr

This commit is contained in:
Darren Ranalli 2008-07-28 20:58:32 +00:00
parent 233501d0a6
commit 29b7a72de9
1 changed files with 54 additions and 6 deletions

View File

@ -29,7 +29,8 @@ __all__ = ['enumerate', 'unique', 'indent', 'nonRepeatingRandomList',
'GoldenRectangle', 'pivotScalar', 'rad90', 'rad180', 'rad270', 'rad360',
'nullGen', 'loopGen', 'makeFlywheelGen', 'flywheel', 'choice',
'printStack', 'printReverseStack', 'listToIndex2item', 'listToItem2index',
'pandaBreak','pandaTrace','formatTimeCompact','DestructiveScratchPad']
'pandaBreak','pandaTrace','formatTimeCompact','DestructiveScratchPad',
'deeptype',]
import types
import string
@ -2261,7 +2262,7 @@ def fastRepr(obj, maxLen=200, strFactor=10, _visitedIds=None):
s = ''
s += {types.TupleType: '(',
types.ListType: '[',}[type(obj)]
if len(obj) > maxLen:
if maxLen is not None and len(obj) > maxLen:
o = obj[:maxLen]
ellips = '...'
else:
@ -2278,7 +2279,7 @@ def fastRepr(obj, maxLen=200, strFactor=10, _visitedIds=None):
return s
elif type(obj) is types.DictType:
s = '{'
if len(obj) > maxLen:
if maxLen is not None and len(obj) > maxLen:
o = obj.keys()[:maxLen]
ellips = '...'
else:
@ -2294,8 +2295,9 @@ def fastRepr(obj, maxLen=200, strFactor=10, _visitedIds=None):
s += '}'
return s
elif type(obj) is types.StringType:
maxLen *= strFactor
if len(obj) > maxLen:
if maxLen is not None:
maxLen *= strFactor
if maxLen is not None and len(obj) > maxLen:
return safeRepr(obj[:maxLen])
else:
return safeRepr(obj)
@ -2445,11 +2447,56 @@ class RefCounter:
def itype(obj):
t = type(obj)
if t is types.InstanceType:
return '%s of <class %s>' % (repr(types.InstanceType),
return '%s of <class %s>>' % (repr(types.InstanceType)[:-1],
str(obj.__class__))
else:
return t
def deeptype(obj, maxLen=100, _visitedIds=None):
if _visitedIds is None:
_visitedIds = set()
if id(obj) in _visitedIds:
return '<ALREADY-VISITED %s>' % itype(obj)
t = type(obj)
if t in (types.TupleType, types.ListType):
s = ''
s += {types.TupleType: '(',
types.ListType: '[',}[type(obj)]
if maxLen is not None and len(obj) > maxLen:
o = obj[:maxLen]
ellips = '...'
else:
o = obj
ellips = ''
_visitedIds.add(id(obj))
for item in o:
s += deeptype(item, maxLen, _visitedIds=_visitedIds)
s += ', '
_visitedIds.remove(id(obj))
s += ellips
s += {types.TupleType: ')',
types.ListType: ']',}[type(obj)]
return s
elif type(obj) is types.DictType:
s = '{'
if maxLen is not None and len(obj) > maxLen:
o = obj.keys()[:maxLen]
ellips = '...'
else:
o = obj.keys()
ellips = ''
_visitedIds.add(id(obj))
for key in o:
value = obj[key]
s += '%s: %s, ' % (deeptype(key, maxLen, _visitedIds=_visitedIds),
deeptype(value, maxLen, _visitedIds=_visitedIds))
_visitedIds.remove(id(obj))
s += ellips
s += '}'
return s
else:
return itype(obj)
def getNumberedTypedString(items, maxLen=5000, numPrefix=''):
"""get a string that has each item of the list on its own line,
and each item is numbered on the left from zero"""
@ -3455,3 +3502,4 @@ __builtin__.MiniLogSentry = MiniLogSentry
__builtin__.logBlock = logBlock
__builtin__.HierarchyException = HierarchyException
__builtin__.pdir = pdir
__builtin__.deeptype = deeptype