diff --git a/direct/src/showbase/PythonUtil.py b/direct/src/showbase/PythonUtil.py index d51d9e5c48..99bdeb1568 100644 --- a/direct/src/showbase/PythonUtil.py +++ b/direct/src/showbase/PythonUtil.py @@ -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 ' % (repr(types.InstanceType), + return '%s of >' % (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 '' % 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