libera_utils.spice_utils.ensure_spice#
- libera_utils.spice_utils.ensure_spice(f_py: Callable = None, time_kernels_only: bool = False)#
Before trying to understand this piece of code, read this: https://stackoverflow.com/questions/5929107/decorators-with-parameters/60832711#60832711
Decorator/wrapper that tries to ensure that a metakernel is furnished in as complete a way as possible.
Control flow overview:
- Try simply calling the wrapped function naively.
SUCCESS? Great! We’re done.
SpiceyError? Go to step 2.
- Furnish metakernel at SPICE_METAKERNEL
SUCCESS? Great, return the original function again (so it can be re-run).
KeyError? Seems like SPICE_METAKERNEL isn’t set, no problem. Go to step 3.
Usage:
Three ways to use this object
A decorator with no arguments
@ensure_spice def my_spicey_func(a, b): pass
2. A decorator with parameters. This is useful if we only need the latest SCLK and LSK kernels for the function involved.
@ensure_spice(time_kernels_only=True) def my_spicey_time_func(a, b): pass
An explicit wrapper function, providing a dynamically set value for parameters, e.g. time_kernels_only
wrapped = ensure_spice(spicey_func, time_kernels_only=True) result = wrapped(*args, **kwargs)
- Parameters:
f_py (Callable) – The function requiring SPICE that we are going to wrap if being used explicitly, Otherwise None, in which case ensure_spice is being used, not as a function wrapper (see l2a_processing.py) but as a true decorator without an explicit function argument.
time_kernels_only (bool, Optional) – Specify that we only need to furnish time kernels (if SPICE_METAKERNEL is set, we still just furnish that metakernel and assume the time kernels are included.
- Returns:
Decorated function, with spice error handling
- Return type:
Callable