code: def _maintain_LC(self, obj, slice_id, last_slice=False, begin_slice=True,
                     shard_ctx=None, slice_ctx=None):
      
      if obj is None or not isinstance(obj, shard_life_cycle._ShardLifeCycle):
        return
  
      shard_context = shard_ctx or self.shard_context
      slice_context = slice_ctx or self.slice_context
      if begin_slice:
        if slice_id == 0:
          obj.begin_shard(shard_context)
        obj.begin_slice(slice_context)
      else:
        obj.end_slice(slice_context)
        if last_slice:
          obj.end_shard(shard_context)
docs: Makes sure shard life cycle interface are respected.
  
      Args:
        obj: the obj that may have implemented _ShardLifeCycle.
        slice_id: current slice_id
        last_slice: whether this is the last slice.
        begin_slice: whether this is the beginning or the end of a slice.
        shard_ctx: shard ctx for dependency injection. If None, it will be read
          from self.
        slice_ctx: slice ctx for dependency injection. If None, it will be read
          from self.