Source code for axiom.decorators
"""Decorators."""
import functools
import xarray as xr
[docs]def singleton(cls):
"""Define a class as a singleton.
Returns:
object: Singleton
"""
instance = [None]
@functools.wraps(cls)
def _singleton(*args, **kwargs):
if instance[0] is None:
instance[0] = cls(*args, **kwargs)
return instance[0]
return _singleton
[docs]def metadata(**meta):
"""Apply metadata to the xarray outputs of a function.
Usage Example:
@metadata(units='K')
def get_temp(ds):
return ds.T
"""
def _metadata(func):
@functools.wraps(func)
def __metadata(*args, **kwargs):
result = func(*args, **kwargs)
# Allow name to be set on DataArrays, special edge case.
if 'name' in meta.keys() and isinstance(result, xr.DataArray):
result.name = meta.pop('name')
# Allow the user to completely replace any existing metadata
if 'replace' in meta.keys() and meta['replace'] is True:
meta.pop('replace')
result.attrs = meta
else:
result.attrs.update(meta)
return result
return __metadata
return _metadata