<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def upload_part(self, bucket, object_name, upload_id, part_number, data=None, content_type=None, metadata={}, body_producer=None):
 """ Upload a part of data corresponding to a multipart upload. @param bucket: The bucket name @param object_name: The object name @param upload_id: The multipart upload id @param part_number: The part number @param data: Data (optional, requires body_producer if not specified) @param content_type: The Content-Type @param metadata: Additional metadata @param body_producer: an C{IBodyProducer} (optional, requires data if not specified) @return: the C{Deferred} from underlying query.submit() call """

        parms = 'partNumber=%s&uploadId=%s' % (str(part_number), upload_id)
        objectname_plus = '%s?%s' % (object_name, parms)
        details = self._details(
            method=b"PUT",
            url_context=self._url_context(bucket=bucket, object_name=objectname_plus),
            headers=self._headers(content_type),
            metadata=metadata,
            body=data,
        )
        d = self._submit(self._query_factory(details))
        d.addCallback(lambda (response, data): _to_dict(response.responseHeaders))
        return d