<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:

def _finish_remove(self, num_bytes_to_remove, is_partition):
        # type: (int, bool) -> None
        '''
        An internal method to do all of the accounting needed whenever
        something is removed from the ISO.  This method should only be called
        by public API implementations.

        Parameters:
         num_bytes_to_remove - The number of additional bytes to remove from the descriptors.
         is_partition - Whether these bytes are part of a UDF partition.
        Returns:
         Nothing.
        '''
        for pvd in self.pvds:
            pvd.remove_from_space_size(num_bytes_to_remove)
        if self.joliet_vd is not None:
            self.joliet_vd.remove_from_space_size(num_bytes_to_remove)

        if self.enhanced_vd is not None:
            self.enhanced_vd.copy_sizes(self.pvd)

        if self.udf_root is not None and is_partition:
            num_extents_to_remove = utils.ceiling_div(num_bytes_to_remove,
                                                      self.pvd.logical_block_size())

            self.udf_main_descs.partition.part_length -= num_extents_to_remove
            self.udf_reserve_descs.partition.part_length -= num_extents_to_remove
            self.udf_logical_volume_integrity.size_table -= num_extents_to_remove

        if self._always_consistent:
            self._reshuffle_extents()
        else:
            self._needs_reshuffle = True