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