docs: def from_params(cls, params):
          """Returns a list of MultipartParam objects from a sequence of
          name, value pairs, MultipartParam instances,
          or from a mapping of names to values
  
          The values may be strings or file objects, or MultipartParam objects.
          MultipartParam object names must match the given names in the
          name,value pairs or mapping, if applicable."""
          if hasattr(params, 'items'):
              params = params.items()
  
          retval = []
          for item in params:
              if isinstance(item, cls):
                  retval.append(item)
                  continue
              name, value = item
              if isinstance(value, cls):
                  assert value.name == name
                  retval.append(value)
                  continue
              if hasattr(value, 'read'):
                  # Looks like a file object
                  filename = getattr(value, 'name', None)
                  if filename is not None:
                      filetype = mimetypes.guess_type(filename)[0]
                  else:
                      filetype = None
  
                  retval.append(cls(name=name, filename=filename,
                                    filetype=filetype, fileobj=value))
              else:
                  retval.append(cls(name, value))
          return retval