docs: def _extract_stars(data, catalog, size=(11, 11), use_xy=True):
      """
      Extract cutout images from a single image centered on stars defined
      in the single input catalog.
  
      Parameters
      ----------
      data : `~astropy.nddata.NDData`
          A `~astropy.nddata.NDData` object containing the 2D image from
          which to extract the stars.  If the input ``catalog`` contains
          only the sky coordinates (i.e. not the pixel coordinates) of the
          stars then the `~astropy.nddata.NDData` object must have a valid
          ``wcs`` attribute.
  
      catalogs : `~astropy.table.Table`
          A single catalog of sources to be extracted from the input
          ``data``.  The center of each source can be defined either in
          pixel coordinates (in ``x`` and ``y`` columns) or sky
          coordinates (in a ``skycoord`` column containing a
          `~astropy.coordinates.SkyCoord` object).  If both are specified,
          then the value of the ``use_xy`` keyword determines which
          coordinates will be used.
  
      size : int or array_like (int), optional
          The extraction box size along each axis.  If ``size`` is a
          scalar then a square box of size ``size`` will be used.  If
          ``size`` has two elements, they should be in ``(ny, nx)`` order.
          The size must be greater than or equal to 3 pixel for both axes.
  
      use_xy : bool, optional
          Whether to use the ``x`` and ``y`` pixel positions when both
          pixel and sky coordinates are present in the input catalog
          table.  If `False` then sky coordinates are used instead of
          pixel coordinates (e.g. for linked stars).  The default is
          `True`.
  
      Returns
      -------
      stars : list of `EPSFStar` objects
          A list of `EPSFStar` instances containing the extracted stars.
      """
  
      colnames = catalog.colnames
      if ('x' not in colnames or 'y' not in colnames) or not use_xy:
          xcenters, ycenters = skycoord_to_pixel(catalog['skycoord'], data.wcs,
                                                 origin=0, mode='all')
      else:
          xcenters = catalog['x'].data.astype(np.float)
          ycenters = catalog['y'].data.astype(np.float)
  
      if 'id' in colnames:
          ids = catalog['id']
      else:
          ids = np.arange(len(catalog), dtype=np.int) + 1
  
      if data.uncertainty is None:
          weights = np.ones_like(data.data)
      else:
          if data.uncertainty.uncertainty_type == 'weights':
              weights = np.asanyarray(data.uncertainty.array, dtype=np.float)
          else:
              warnings.warn('The data uncertainty attribute has an unsupported '
                            'type.  Only uncertainty_type="weights" can be '
                            'used to set weights.  Weights will be set to 1.',
                            AstropyUserWarning)
              weights = np.ones_like(data.data)
  
      if data.mask is not None:
          weights[data.mask] = 0.
  
      stars = []
      for xcenter, ycenter, obj_id in zip(xcenters, ycenters, ids):
          try:
              large_slc, small_slc = overlap_slices(data.data.shape, size,
                                                    (ycenter, xcenter),
                                                    mode='strict')
              data_cutout = data.data[large_slc]
              weights_cutout = weights[large_slc]
          except (PartialOverlapError, NoOverlapError):
              stars.append(None)
              continue
  
          origin = (large_slc[1].start, large_slc[0].start)
          cutout_center = (xcenter - origin[0], ycenter - origin[1])
          star = EPSFStar(data_cutout, weights_cutout,
                          cutout_center=cutout_center, origin=origin,
                          wcs_large=data.wcs, id_label=obj_id)
  
          stars.append(star)
  
      return stars