docs: def isotopic_variants(composition, npeaks=None, charge=0, charge_carrier=PROTON):
      '''
      Compute a peak list representing the theoretical isotopic cluster for `composition`.
  
      Parameters
      ----------
      composition : Mapping
          Any Mapping type where keys are element symbols and values are integers
      npeaks: int
          The number of peaks to include in the isotopic cluster, starting from the monoisotopic peak.
          If given a number below 1 or above the maximum number of isotopic variants, the maximum will
          be used. If `None`, a "reasonable" value is chosen by `int(sqrt(max_variants(composition)))`.
      charge: int
          The charge state of the isotopic cluster to produce. Defaults to 0, theoretical neutral mass.
  
      Returns
      -------
      list of Peaks
  
      See Also
      --------
      :class:`IsotopicDistribution`
  
      '''
      if npeaks is None:
          max_n_variants = max_variants(composition)
          npeaks = int(sqrt(max_n_variants) - 2)
          npeaks = max(npeaks, 3)
      else:
          # Monoisotopic Peak is not included
          npeaks -= 1
      return IsotopicDistribution(composition, npeaks).aggregated_isotopic_variants(
          charge, charge_carrier=charge_carrier)