code: def _split_input_from_params(cls, app, namespaces, entity_kind_name,
                                 params, shard_count):
      
      # pylint: disable=redefined-outer-name
      key_ranges = []  # KeyRanges for all namespaces
      for namespace in namespaces:
        key_ranges.extend(
            cls._split_input_from_namespace(app,
                                            namespace,
                                            entity_kind_name,
                                            shard_count))
  
      # Divide the KeyRanges into shard_count shards. The KeyRanges for different
      # namespaces might be very different in size so the assignment of KeyRanges
      # to shards is done round-robin.
      shared_ranges = [[] for _ in range(shard_count)]
      for i, k_range in enumerate(key_ranges):
        shared_ranges[i % shard_count].append(k_range)
      batch_size = int(params.get(cls.BATCH_SIZE_PARAM, cls._BATCH_SIZE))
  
      return [cls(entity_kind_name,
                  key_ranges=key_ranges,
                  ns_range=None,
                  batch_size=batch_size)
              for key_ranges in shared_ranges if key_ranges]
docs: Return input reader objects. Helper for split_input.