code: def _list_object_parts(self, bucket_name, object_name, upload_id):
          
          is_valid_bucket_name(bucket_name)
          is_non_empty_string(object_name)
          is_non_empty_string(upload_id)
  
          query = {
              'uploadId': upload_id,
              'max-parts': '1000'
          }
  
          is_truncated = True
          part_number_marker = ''
          while is_truncated:
              if part_number_marker:
                  query['part-number-marker'] = str(part_number_marker)
  
              response = self._url_open('GET',
                                        bucket_name=bucket_name,
                                        object_name=object_name,
                                        query=query)
  
              parts, is_truncated, part_number_marker = parse_list_parts(
                  response.data,
                  bucket_name=bucket_name,
                  object_name=object_name,
                  upload_id=upload_id
              )
              for part in parts:
                  yield part
docs: List all parts.
  
          :param bucket_name: Bucket name to list parts for.
          :param object_name: Object name to list parts for.
          :param upload_id: Upload id of the previously uploaded object name.