lsst.pipe.tasks  21.0.0-105-g89a8187d+5c5fa69342
_baseDataFrameActions.py
Go to the documentation of this file.
1 from __future__ import annotations
2 
3 __all__ = ("DataFrameAction",)
4 
5 from lsst.pex.config import Field, ListField
6 from typing import Iterable, Any, Mapping
7 
8 from ..configurableActions import ConfigurableAction
9 
10 
12  _actionCache: Mapping[int, Any]
13 
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)
19 
20  def __init_subclass__(cls, **kwargs) -> None:
21  cls._actionCache_actionCache = {}
22 
23  def call_wrapper(function):
24  def inner_wrapper(self, dataFrame, **kwargs):
25  dfId = id(dataFrame)
26  extra = []
27  for name in (self.cacheArgscacheArgs 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.cachecache and self._frozen:
35  # look up to see if the value is in cache already
36  if result := self._actionCache_actionCache.get(key):
37  return result
38  result = function(self, dataFrame, **kwargs)
39  if self.cachecache and self._frozen:
40  self._actionCache_actionCache[key] = result
41  return result
42  return inner_wrapper
43  cls.__call____call____call____call__ = call_wrapper(cls.__call____call____call____call__)
44  super().__init_subclass__(**kwargs)
45 
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")
51 
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")