Source code for neutralocean.ppinterp.tools

import functools as ft
from importlib import import_module


[docs]@ft.lru_cache(maxsize=10) def make_pp( interpolant="linear", kind="u", out="coeffs", nans=True, num_dep_vars=1, ): """Make function for piecewise polynomial interpolation.""" if interpolant not in ("linear", "pchip"): raise ValueError( f"Expected `interpolant` in ('lienar', 'pchip'); got {interpolant}" ) if kind not in ("1", "u"): raise ValueError(f"Expected `kind` in ('1', 'u'); got {kind}") if out not in ("coeffs", "interp"): raise ValueError(f"Expected `out` in ('coeffs', 'interp'); got {out}") if num_dep_vars not in (1, 2): raise ValueError( "Expected `num_dep_vars` in (1, 2); got {num_dep_vars}" ) if out == "coeffs" and num_dep_vars != 1: raise ValueError( "With `out='coeffs'`, currently only handles `num_dep_vars=1`" ) if nans == False: if out == "interp" or kind == "u": raise ValueError( "With `nans=False`, expected `out='coeffs'` and `kind='1'`." ) # Begin programmatically generating the function name to import if kind == "1": kind = "_1" elif kind == "u": kind = "" if nans == False and interpolant == "pchip": nans = "_nonan" else: # if interpolant == "linear", just use regular coeffs_1 function. nans = "" if num_dep_vars == 1: num_dep_vars = "" elif num_dep_vars == 2: num_dep_vars = "_two" fcn_name = interpolant + "_" + out + kind + nans + num_dep_vars # Below is equivalent to # from neutralocean.ppinterp.`interpolant` import `fcn_name` return import_module( "neutralocean.ppinterp." + interpolant ).__getattribute__(fcn_name)