'Returns a list of input shard states for the input spec.
Args:
mapper_spec: The MapperSpec for this InputReader. Must contain
\'blob_key\' parameter with one blob key.
_reader: a callable that returns a file-like object for reading blobs.
Used for dependency injection.
Returns:
A list of InputReaders spanning files within the zip.
Raises:
BadReaderParamsError: required parameters are missing or invalid.'

@classmethod
def split_input(cls, mapper_spec, _reader=blobstore.BlobReader):

    if (mapper_spec.input_reader_class() != cls):
        raise BadReaderParamsError('Mapper    input    reader    class    mismatch')
    params = mapper_spec.params
    if (cls.BLOB_KEY_PARAM not in params):
        raise BadReaderParamsError("Must    specify    'blob_key'    for    mapper    input")
    blob_key = params[cls.BLOB_KEY_PARAM]
    zip_input = zipfile.ZipFile(_reader(blob_key))
    files = zip_input.infolist()
    total_size = sum((x.file_size for x in files))
    num_shards = min(mapper_spec.shard_count, cls._MAX_SHARD_COUNT)
    size_per_shard = (total_size // num_shards)
    shard_start_indexes = [0]
    current_shard_size = 0
    for (i, fileinfo) in enumerate(files):
        current_shard_size += fileinfo.file_size
        if (current_shard_size >= size_per_shard):
            shard_start_indexes.append((i + 1))
            current_shard_size = 0
    if (shard_start_indexes[(-1)] != len(files)):
        shard_start_indexes.append(len(files))
    return [cls(blob_key, start_index, end_index, _reader) for (start_index, end_index) in zip(shard_start_indexes, shard_start_indexes[1:])]
