Index: issm/trunk-jpl/src/m/qmu/helpers.py
===================================================================
--- issm/trunk-jpl/src/m/qmu/helpers.py	(revision 25065)
+++ issm/trunk-jpl/src/m/qmu/helpers.py	(revision 25455)
@@ -6,10 +6,10 @@
 
 class struct(object):
-    '''An empty struct that can be assigned arbitrary attributes'''
+    """An empty struct that can be assigned arbitrary attributes"""
     pass
 
 
 class Lstruct(list):
-    '''
+    """
     An empty struct that can be assigned arbitrary attributes but can also be 
     accesed as a list. Eg. x.y = 'hello', x[:] = ['w', 'o', 'r', 'l', 'd']
@@ -46,5 +46,5 @@
     Sources:
     -https://github.com/Vectorized/Python-Attribute-List
-    '''
+    """
 
     def __new__(self, *args, **kwargs):
@@ -64,5 +64,5 @@
 
 class OrderedStruct(object):
-    '''
+    """
     A form of dictionary-like structure that maintains the ordering in which 
     its fields/attributes and their corresponding values were added.
@@ -113,12 +113,12 @@
     Note: to access internal fields use dir(x) (input fields will be included, 
     but are not technically internals)
-    '''
+    """
 
     def __init__(self, *args):
-        '''
+        """
         Provided either nothing or a series of strings, construct a structure 
         that will, when accessed as a list, return its fields in the same order 
         in which they were provided
-        '''
+        """
 
         # keys and values
@@ -187,9 +187,9 @@
 
     def __copy__(self):
-        '''
+        """
         shallow copy, hard copies of trivial attributes,
         references to structures like lists/OrderedDicts
         unless redefined as an entirely different structure
-        '''
+        """
         newInstance = type(self)()
         for k, v in list(self.items()):
@@ -198,5 +198,5 @@
 
     def __deepcopy__(self, memo=None):
-        '''
+        """
         hard copy of all attributes
         same thing but call deepcopy recursively
@@ -204,5 +204,5 @@
         (see https://docs.python.org/2/library/copy.html  #copy.deepcopy )
         but will generally work in this case
-        '''
+        """
         newInstance = type(self)()
         for k, v in list(self.items()):
@@ -232,9 +232,9 @@
 
 def isempty(x):
-    '''
+    """
     returns true if object is +/-infinity, NaN, None, '', has length 0, or is 
     an array/matrix composed only of such components (includes mixtures of 
     "empty" types)
-    '''
+    """
 
     if type(x) in [list, np.ndarray, tuple]:
@@ -270,9 +270,9 @@
 
 def fieldnames(x, ignore_internals=True):
-    '''
+    """
     returns a list of fields of x
     ignore_internals ignores all fieldnames starting with '_' and is True by 
     default
-    '''
+    """
     result = list(vars(x).keys())
 
@@ -284,17 +284,17 @@
 
 def isfield(x, y, ignore_internals=True):
-    '''
+    """
     is y is a field of x?
     ignore_internals ignores all fieldnames starting with '_' and is True by 
     default
-    '''
+    """
     return str(y) in fieldnames(x, ignore_internals)
 
 
 def fileparts(x):
-    '''
+    """
     given:   "path/path/.../file_name.ext"
     returns: [path, file_name, ext] (list of strings)
-    '''
+    """
     try:
         a = x[:x.rindex('/')]  #path
@@ -311,5 +311,5 @@
 
 def fullfile(*args):
-    '''
+    """
     usage:
         fullfile(path, path, ... , file_name + ext)
@@ -322,5 +322,5 @@
         as final arguments ('file.doc') or ('file' + '.doc') will work
         ('final', '.doc'), and the like, will not (you'd get 'final/.doc')
-    '''
+    """
     result = str(args[0])
     for i in range(len(args[1:])):
@@ -334,5 +334,5 @@
 
 def findline(fidi, s):
-    '''
+    """
     returns full first line containing s (as a string), or None
 
@@ -340,5 +340,5 @@
     use str(findline(f, s)).strip() to remove these, str() in case result is 
     None
-    '''
+    """
     for line in fidi:
         if s in line:
@@ -348,5 +348,5 @@
 
 def empty_nd_list(shape, filler=0., as_numpy_ndarray=False):
-    '''
+    """
     returns a python list of the size/shape given (shape must be int or tuple)
     the list will be filled with the optional second argument
@@ -363,5 +363,5 @@
         empty_nd_list((5, 5), 0.0)  # returns a 5x5 matrix of 0.0's
         empty_nd_list(5, None)  # returns a 5 long array of NaN
-    '''
+    """
     result = np.empty(shape)
     result.fill(filler)
