def leastsqfitter(p0, datax, datay, function, verbose=False, cov_verbose=False):
    """Conveniently call scipy.optmize.leastsq().

    Returns fit parameters and their errors.

    Parameters
    ----------
    p0 : list
        list of guess parameters to pass to function
    datax : array
        array of independent values
    datay : array
        array of dependent values
    function : function
        function object to fit data to. Must be of the callable form function(p, x)
    verbose : bool
        toggles printing of fit time, fit params, and fit param errors
    cov_verbose : bool
        toggles printing of covarience matrix

    Returns
    -------
    pfit_leastsq : list
        list of fit parameters. s.t. the error between datay and function(p, datax) is minimized
    perr_leastsq : list
        list of fit parameter errors (1 std)
    """
    timer = Timer(verbose=False)
    with timer:
        # define error function
        def errfunc(p, x, y):
            return y - function(p, x)

        # run optimization
        pfit_leastsq, pcov, infodict, errmsg, success = scipy_optimize.leastsq(
            errfunc, p0, args=(datax, datay), full_output=1, epsfcn=0.0001
        )
        # calculate covarience matrix
        # original idea https://stackoverflow.com/a/21844726
        if (len(datay) > len(p0)) and pcov is not None:
            s_sq = (errfunc(pfit_leastsq, datax, datay) ** 2).sum() / (len(datay) - len(p0))
            pcov = pcov * s_sq
            if cov_verbose:
                print(pcov)
        else:
            pcov = np.array(np.inf)
        # calculate and write errors
        error = []
        for i in range(len(pfit_leastsq)):
            try:
                error.append(np.absolute(pcov[i][i]) ** 0.5)
            except IndexError:
                error.append(0.00)
        perr_leastsq = np.array(error)
    # exit
    if verbose:
        print("fit params:       ", pfit_leastsq)
        print("fit params error: ", perr_leastsq)
        print("fitting done in %f seconds" % timer.interval)
    return pfit_leastsq, perr_leastsq
Conveniently call scipy.optmize.leastsq().

    Returns fit parameters and their errors.

    Parameters
    ----------
    p0 : list
        list of guess parameters to pass to function
    datax : array
        array of independent values
    datay : array
        array of dependent values
    function : function
        function object to fit data to. Must be of the callable form function(p, x)
    verbose : bool
        toggles printing of fit time, fit params, and fit param errors
    cov_verbose : bool
        toggles printing of covarience matrix

    Returns
    -------
    pfit_leastsq : list
        list of fit parameters. s.t. the error between datay and function(p, datax) is minimized
    perr_leastsq : list
        list of fit parameter errors (1 std)