Source code for hydropandas.extensions.accessor

"""Copied from ./pandas/core/accessor.py."""

import warnings


[docs]class CachedAccessor: """Custom property-like object (descriptor) for caching accessors. Parameters ---------- name : str The namespace this will be accessed under, e.g. ``df.foo`` accessor : cls The class with the extension methods. The class' __init__ method should expect one of a ``Series``, ``DataFrame`` or ``Index`` as the single argument ``data`` """ def __init__(self, name, accessor): self._name = name self._accessor = accessor def __get__(self, obj, cls): if obj is None: # we're accessing the attribute of the class, i.e., Dataset.geo return self._accessor accessor_obj = self._accessor(obj) # Replace the property with the accessor object. Inspired by: # http://www.pydanny.com/cached-property.html # We need to use object.__setattr__ because we overwrite __setattr__ on # NDFrame object.__setattr__(obj, self._name, accessor_obj) return accessor_obj
def _register_accessor(name, cls): def decorator(accessor): if hasattr(cls, name): warnings.warn( "registration of accessor {!r} under name {!r} for type " "{!r} is overriding a preexisting attribute with the same " "name.".format(accessor, name, cls), UserWarning, stacklevel=2, ) setattr(cls, name, CachedAccessor(name, accessor)) cls._accessors.add(name) return accessor return decorator
[docs]def register_obscollection_accessor(name): from .. import obs_collection as oc return _register_accessor(name, oc.ObsCollection)
[docs]def register_obs_accessor(name): from .. import observation as obs return _register_accessor(name, obs.Obs)