docs: def get_structdmtypes_for_python_typeorobject(typeorobj):
      """
      Return structchar, dmtype for the python (or numpy)
      type or object typeorobj.
      For more complex types we only return the dm type
      """
      # not isinstance is probably a bit more lenient than 'is'
      # ie isinstance(x,str) is nicer than type(x) is str.
      # hence we use isinstance when available
      if isinstance(typeorobj, type):
          comparer = lambda test: test is typeorobj
      else:
          comparer = lambda test: isinstance(typeorobj, test)
  
      if comparer(int) and not -2**31 < typeorobj < 2**31 - 1:
          return 'q', 11
  
      for key, name, sc, types in dm_simple_names:
          for t in types:
              if comparer(t):
                  return sc, key
      if comparer(str):
          return None, get_dmtype_for_name('array')  # treat all strings as arrays!
      elif comparer(unicode_type):
          return None, get_dmtype_for_name('array')  # treat all strings as arrays!
      elif comparer(array.array):
          return None, get_dmtype_for_name('array')
      elif comparer(tuple):
          return None, get_dmtype_for_name('struct')
      elif comparer(structarray):
          return None, get_dmtype_for_name('array')
      logging.warn("No appropriate DMType found for %s, %s", typeorobj, type(typeorobj))
      return None