Browse Source

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

Darren Ranalli 17 years ago
parent
commit
29b7a72de9
1 changed files with 54 additions and 6 deletions
  1. 54 6
      direct/src/showbase/PythonUtil.py

+ 54 - 6
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 <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