|
|
@@ -61,7 +61,7 @@ def writeFsmTree(instance, indent = 0):
|
|
|
if hasattr(instance.fsm, 'state'):
|
|
|
name = instance.fsm.state.name
|
|
|
print "%s: %s"%(instance.fsm.name, name)
|
|
|
-
|
|
|
+
|
|
|
|
|
|
|
|
|
|
|
|
@@ -73,7 +73,7 @@ if __debug__:
|
|
|
that is printed as part of the trace back.
|
|
|
This is just to make it easier to tell what the
|
|
|
stack trace is referring to.
|
|
|
- start is an integer number of stack frames back
|
|
|
+ start is an integer number of stack frames back
|
|
|
from the most recent. (This is automatically
|
|
|
bumped up by one to skip the __init__ call
|
|
|
to the StackTrace).
|
|
|
@@ -141,6 +141,33 @@ def printThisCall():
|
|
|
return 1 # to allow "assert printThisCall()"
|
|
|
|
|
|
|
|
|
+if __debug__:
|
|
|
+ def lineage(obj, verbose=0, indent=0):
|
|
|
+ """
|
|
|
+ return instance or class name in as a multiline string.
|
|
|
+
|
|
|
+ Usage: print lineage(foo)
|
|
|
+
|
|
|
+ (Based on getClassLineage())
|
|
|
+ """
|
|
|
+ r=""
|
|
|
+ if type(obj) == types.ListType:
|
|
|
+ r+=(" "*indent)+"python list\n"
|
|
|
+ elif type(obj) == types.DictionaryType:
|
|
|
+ r+=(" "*indent)+"python dictionary\n"
|
|
|
+ elif type(obj) == types.ModuleType:
|
|
|
+ r+=(" "*indent)+str(obj)+"\n"
|
|
|
+ elif type(obj) == types.InstanceType:
|
|
|
+ r+=lineage(obj.__class__, verbose, indent)
|
|
|
+ elif type(obj) == types.ClassType:
|
|
|
+ r+=(" "*indent)
|
|
|
+ if verbose:
|
|
|
+ r+=obj.__module__+"."
|
|
|
+ r+=obj.__name__+"\n"
|
|
|
+ for c in obj.__bases__:
|
|
|
+ r+=lineage(c, verbose, indent+2)
|
|
|
+ return r
|
|
|
+
|
|
|
def tron():
|
|
|
sys.settrace(trace)
|
|
|
def trace(frame, event, arg):
|
|
|
@@ -399,7 +426,7 @@ class Signature:
|
|
|
def aproposAll(obj):
|
|
|
"""
|
|
|
Print out a list of all members and methods (including overloaded methods)
|
|
|
- of an instance or class
|
|
|
+ of an instance or class
|
|
|
"""
|
|
|
apropos(obj, fOverloaded = 1, fTruncate = 0)
|
|
|
|
|
|
@@ -412,14 +439,14 @@ def adjust(command = None, dim = 1, parent = None, **kw):
|
|
|
"""
|
|
|
adjust(command = None, parent = None, **kw)
|
|
|
Popup and entry scale to adjust a parameter
|
|
|
-
|
|
|
+
|
|
|
Accepts any Slider keyword argument. Typical arguments include:
|
|
|
command: The one argument command to execute
|
|
|
min: The min value of the slider
|
|
|
max: The max value of the slider
|
|
|
resolution: The resolution of the slider
|
|
|
text: The label on the slider
|
|
|
-
|
|
|
+
|
|
|
These values can be accessed and/or changed after the fact
|
|
|
>>> vg = adjust()
|
|
|
>>> vg['min']
|
|
|
@@ -565,7 +592,7 @@ def reduceAngle(deg):
|
|
|
Reduces an angle (in degrees) to a value in [-180..180)
|
|
|
"""
|
|
|
return (((deg + 180.) % 360.) - 180.)
|
|
|
-
|
|
|
+
|
|
|
def fitSrcAngle2Dest(src, dest):
|
|
|
"""
|
|
|
given a src and destination angle, returns an equivalent src angle
|
|
|
@@ -687,7 +714,7 @@ class Functor:
|
|
|
self._kargs = kargs
|
|
|
self.__name__ = 'Functor: %s' % self._function.__name__
|
|
|
self.__doc__ = self._function.__doc__
|
|
|
-
|
|
|
+
|
|
|
def __call__(self, *args, **kargs):
|
|
|
"""call function"""
|
|
|
_args = list(self._args)
|
|
|
@@ -758,7 +785,7 @@ def formatElapsedSeconds(seconds):
|
|
|
if hours > 36:
|
|
|
days = math.floor((hours + 12) / 24)
|
|
|
return "%s%d days" % (sign, days)
|
|
|
-
|
|
|
+
|
|
|
seconds -= hours * (60 * 60)
|
|
|
minutes = (int)(seconds / 60)
|
|
|
seconds -= minutes * 60
|
|
|
@@ -874,7 +901,7 @@ def findPythonModule(module):
|
|
|
pathname = os.path.join(dir, filename)
|
|
|
if os.path.exists(pathname):
|
|
|
return pathname
|
|
|
-
|
|
|
+
|
|
|
return None
|
|
|
|
|
|
def describeException(backTrace = 4):
|
|
|
@@ -896,7 +923,7 @@ def describeException(backTrace = 4):
|
|
|
line += lnotab[i+1]
|
|
|
|
|
|
return line
|
|
|
-
|
|
|
+
|
|
|
infoArr = sys.exc_info()
|
|
|
exception = infoArr[0]
|
|
|
exceptionName = getattr(exception, '__name__', None)
|
|
|
@@ -923,7 +950,7 @@ def describeException(backTrace = 4):
|
|
|
description = ""
|
|
|
for i in range(len(stack) - 1, max(len(stack) - backTrace, 0) - 1, -1):
|
|
|
description += stack[i]
|
|
|
-
|
|
|
+
|
|
|
description += "%s: %s" % (exceptionName, extraInfo)
|
|
|
return description
|
|
|
|
|
|
@@ -1000,10 +1027,10 @@ def normalDistrib(a, b, gauss=random.gauss):
|
|
|
====================
|
|
|
All normal density curves satisfy the following property which is often
|
|
|
referred to as the Empirical Rule:
|
|
|
- 68% of the observations fall within 1 standard deviation of the mean.
|
|
|
+ 68% of the observations fall within 1 standard deviation of the mean.
|
|
|
95% of the observations fall within 2 standard deviations of the mean.
|
|
|
99.7% of the observations fall within 3 standard deviations of the mean.
|
|
|
-
|
|
|
+
|
|
|
Thus, for a normal distribution, almost all values lie within 3 standard
|
|
|
deviations of the mean.
|
|
|
------------------------------------------------------------------------
|
|
|
@@ -1063,7 +1090,7 @@ class Enum:
|
|
|
starting value.
|
|
|
|
|
|
Example:
|
|
|
-
|
|
|
+
|
|
|
>>> colors = Enum('red, green, blue')
|
|
|
>>> colors.red
|
|
|
0
|
|
|
@@ -1134,7 +1161,7 @@ class Enum:
|
|
|
return 1
|
|
|
|
|
|
############################################################
|
|
|
-# class: Singleton
|
|
|
+# class: Singleton
|
|
|
# Purpose: This provides a base metaclass for all classes
|
|
|
# that require one and only one instance.
|
|
|
#
|
|
|
@@ -1158,7 +1185,7 @@ class Enum:
|
|
|
#
|
|
|
# This causes problems because myNewClassX is a
|
|
|
# New-Style class that inherits from only a
|
|
|
-# Classic-Style base class. There are two ways
|
|
|
+# Classic-Style base class. There are two ways
|
|
|
# simple ways to resolve this issue.
|
|
|
#
|
|
|
# First, if possible, make myClassX a
|
|
|
@@ -1180,4 +1207,4 @@ class Singleton(type):
|
|
|
|
|
|
class SingletonError(ValueError):
|
|
|
""" Used to indicate an inappropriate value for a Singleton."""
|
|
|
-
|
|
|
+
|