|
|
@@ -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
|