docs: def _init_constraints(self, constraints, model):
          """
          Takes the user provided constraints and converts them to a list of
          ``type(model)`` objects, which are extended to also have the
           parameters of ``model``.
  
          :param constraints: iterable of :class:`~sympy.core.relational.Relation`
              objects.
          :return: list of :class:`~symfit.core.fit.Constraint` objects.
          """
          con_models = []
          for constraint in constraints:
              if hasattr(constraint, 'constraint_type'):
                  con_models.append(constraint)
              else:
                  if isinstance(model, BaseNumericalModel):
                      # Numerical models need to be provided with a connectivity
                      # mapping, so we cannot use the type of model. Instead,
                      # use the bare minimum for an analytical model for the
                      # constraint. ToDo: once GradientNumericalModel etc are
                      # introduced, pick the corresponding analytical model for
                      # the constraint.
                      con_models.append(
                          CallableModel.as_constraint(constraint, model)
                      )
                  else:
                      con_models.append(
                          model.__class__.as_constraint(constraint, model)
                      )
          return con_models