Coverage for python/lsst/pipe/tasks/dataFrameActions/_baseDataFrameActions.py : 41%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1from __future__ import annotations
3__all__ = ("DataFrameAction",)
5from lsst.pex.config import Field, ListField
6from typing import Iterable, Any, Mapping
8from ..configurableActions import ConfigurableAction
11class DataFrameAction(ConfigurableAction):
12 _actionCache: Mapping[int, Any]
14 cache = Field(doc="Controls if the results of this action should be cached,"
15 " only works on frozen actions",
16 dtype=bool, default=False)
17 cacheArgs = ListField(doc="If cache is True, this is a list of argument keys that will be used to "
18 "compute the cache key in addition to the DataFrameId", dtype=str)
20 def __init_subclass__(cls, **kwargs) -> None:
21 cls._actionCache = {}
23 def call_wrapper(function):
24 def inner_wrapper(self, dataFrame, **kwargs):
25 dfId = id(dataFrame)
26 extra = []
27 for name in (self.cacheArgs or tuple()):
28 if name not in kwargs:
29 raise ValueError(f"{name} is not part of call signature and cant be used for "
30 "caching")
31 extra.append(kwargs[name])
32 extra.append(dfId)
33 key = tuple(extra)
34 if self.cache and self._frozen:
35 # look up to see if the value is in cache already
36 if result := self._actionCache.get(key):
37 return result
38 result = function(self, dataFrame, **kwargs)
39 if self.cache and self._frozen:
40 self._actionCache[key] = result
41 return result
42 return inner_wrapper
43 cls.__call__ = call_wrapper(cls.__call__)
44 super().__init_subclass__(**kwargs)
46 def __call__(self, dataFrame, **kwargs) -> Iterable[Any]:
47 """This method should return the result of an action performed on a
48 dataframe
49 """
50 raise NotImplementedError("This method should be overloaded in a subclass")
52 @property
53 def columns(self) -> Iterable[str]:
54 """This property should return an iterable of columns needed by this action
55 """
56 raise NotImplementedError("This method should be overloaded in a subclass")