docs: def tryconvert(value, desired_types=SCALAR_TYPES, default=None, empty='', strip=True):
      """
      Convert value to one of the desired_types specified (in order of preference) without raising an exception.
  
      If value is empty is a string and Falsey, then return the `empty` value specified.
      If value can't be converted to any of the desired_types requested, then return the `default` value specified.
  
      >>> tryconvert('MILLEN2000', desired_types=float, default='GENX')
      'GENX'
      >>> tryconvert('1.23', desired_types=[int,float], default='default')
      1.23
      >>> tryconvert('-1.0', desired_types=[int,float])  # assumes you want a float if you have a trailing .0 in a str
      -1.0
      >>> tryconvert(-1.0, desired_types=[int,float])  # assumes you want an int if int type listed first
      -1
      >>> repr(tryconvert('1+1', desired_types=[int,float]))
      'None'
      """
      if value in tryconvert.EMPTY:
          if isinstance(value, basestring):
              return type(value)(empty)
          return empty
      if isinstance(value, basestring):
          # there may not be any "empty" strings that won't be caught by the `is ''` check above, but just in case
          if not value:
              return type(value)(empty)
          if strip:
              value = value.strip()
      if isinstance(desired_types, type):
          desired_types = (desired_types,)
      if desired_types is not None and len(desired_types) == 0:
          desired_types = tryconvert.SCALAR
      if len(desired_types):
          if (isinstance(desired_types, (list, tuple)) and
                  len(desired_types) and
                  isinstance(desired_types[0], (list, tuple))):
              desired_types = desired_types[0]
          elif isinstance(desired_types, type):
              desired_types = [desired_types]
      for t in desired_types:
          try:
              return t(value)
          except (ValueError, TypeError, InvalidOperation, InvalidContext):
              continue
          # if any other weird exception happens then need to get out of here
          return default
      # if no conversions happened successfully then return the default value requested
      return default