code: def prepare(self, data):
          
          def expand(data):
              for name, value in data.items():
                  if isinstance(value, Iterable):
                      for value in value:
                          yield name, value
                  else:
                      yield name, value
  
          # `data` must be an iterable yielding 2-tuples.
          if self.action.method in ("GET", "DELETE"):
              # MAAS does not expect an entity-body for GET or DELETE.
              data = expand(data)
          else:
              # MAAS expects and entity-body for PUT and POST.
              data = data.items()
  
          # Bundle things up ready to throw over the wire.
          uri, body, headers = utils.prepare_payload(
              self.action.op, self.action.method, self.uri, data)
  
          # Headers are returned as a list, but they must be a dict for
          # the signing machinery.
          headers = dict(headers)
  
          # Sign request if credentials have been provided.
          credentials = self.action.handler.session.credentials
          if credentials is not None:
              utils.sign(uri, headers, credentials)
  
          return uri, body, headers
docs: Prepare the call payload.
  
          This is used by `call` and can be overridden to marshal the request in
          a different way.
  
          :param data: Data to pass in the *body* of the request.
          :type data: dict