docs: def dirsearch(word, obj, only_keys = True, deep = 0):
      """
          search a string in dir(<some object>)
          if object is a dict, then search in keys
  
          optional arg only_keys: if False, returns also a str-version of
          the attribute (or dict-value) instead only the key
  
          this function is not case sensitive
      """
      word = word.lower()
  
      if isinstance(obj, dict):
          # only consider keys which are basestrings
          items = [(key, val) for key, val in list(obj.items()) \
                                                  if isinstance(key, str)]
      else:
          #d = dir(obj)
  
          items = []
          for key in dir(obj):
              try:
                  items.append( (key, getattr(obj, key)) )
              except AttributeError:
                  continue
              except NotImplementedError:
                  continue
  
      def maxlen(s, n):
          s = s.replace("\n", " ")
          if len(s) > n:
              s = s[:n-2]+'..'
          return s
  
      def match(word, key, value):
          if only_keys:
              return word in key.lower()
          else:
              # search also in value (if it is of type basestring)
              if not isinstance(value, str):
                  value = "" # only local change
  
              return (word in key.lower()) or (word in value.lower())
  
      res = [(k, maxlen(str(v), 20)) for k,v in items if match(word, k, v)]
      # res is a list of (key,value)-pairs
  
      if deep > 0:
  
          def interesting(obj):
              module = type(sys)
              deep_types  = (module, type, dict)
              res = isinstance(type(obj), deep_types)
              #res = res and not (obj is type)
              return res
  
          deeper_items = [(name, obj) for name, obj in items \
                                      if interesting(obj)]
  
          for name, obj in deeper_items:
              deep_res = dirsearch(word, obj, only_keys=False, deep = deep-1)
              deep_res = [("%s.%s" %(name, d_name), d_obj)
                                          for d_name, d_obj in deep_res]
              res.extend(deep_res)
  
      if only_keys and len(res) >0:
          res = list(zip(*res))[0]
          # now res only contains the keys
      return res