LSST Applications  21.0.0-172-gfb10e10a+18fedfabac,22.0.0+297cba6710,22.0.0+80564b0ff1,22.0.0+8d77f4f51a,22.0.0+a28f4c53b1,22.0.0+dcf3732eb2,22.0.1-1-g7d6de66+2a20fdde0d,22.0.1-1-g8e32f31+297cba6710,22.0.1-1-geca5380+7fa3b7d9b6,22.0.1-12-g44dc1dc+2a20fdde0d,22.0.1-15-g6a90155+515f58c32b,22.0.1-16-g9282f48+790f5f2caa,22.0.1-2-g92698f7+dcf3732eb2,22.0.1-2-ga9b0f51+7fa3b7d9b6,22.0.1-2-gd1925c9+bf4f0e694f,22.0.1-24-g1ad7a390+a9625a72a8,22.0.1-25-g5bf6245+3ad8ecd50b,22.0.1-25-gb120d7b+8b5510f75f,22.0.1-27-g97737f7+2a20fdde0d,22.0.1-32-gf62ce7b1+aa4237961e,22.0.1-4-g0b3f228+2a20fdde0d,22.0.1-4-g243d05b+871c1b8305,22.0.1-4-g3a563be+32dcf1063f,22.0.1-4-g44f2e3d+9e4ab0f4fa,22.0.1-42-gca6935d93+ba5e5ca3eb,22.0.1-5-g15c806e+85460ae5f3,22.0.1-5-g58711c4+611d128589,22.0.1-5-g75bb458+99c117b92f,22.0.1-6-g1c63a23+7fa3b7d9b6,22.0.1-6-g50866e6+84ff5a128b,22.0.1-6-g8d3140d+720564cf76,22.0.1-6-gd805d02+cc5644f571,22.0.1-8-ge5750ce+85460ae5f3,master-g6e05de7fdc+babf819c66,master-g99da0e417a+8d77f4f51a,w.2021.48
LSST Data Management Base Package
_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",
19  dtype=str, optional=True)
20 
21  def __init_subclass__(cls, **kwargs) -> None:
22  cls._actionCache_actionCache = {}
23 
24  def call_wrapper(function):
25  def inner_wrapper(self, dataFrame, **kwargs):
26  dfId = id(dataFrame)
27  extra = []
28  for name in (self.cacheArgscacheArgs or tuple()):
29  if name not in kwargs:
30  raise ValueError(f"{name} is not part of call signature and cant be used for "
31  "caching")
32  extra.append(kwargs[name])
33  extra.append(dfId)
34  key = tuple(extra)
35  if self.cachecache and self._frozen_frozen:
36  # look up to see if the value is in cache already
37  if result := self._actionCache_actionCache.get(key):
38  return result
39  result = function(self, dataFrame, **kwargs)
40  if self.cachecache and self._frozen_frozen:
41  self._actionCache_actionCache[key] = result
42  return result
43  return inner_wrapper
44  cls.__call____call____call____call__ = call_wrapper(cls.__call____call____call____call__)
45  super().__init_subclass__(**kwargs)
46 
47  def __call__(self, dataFrame, **kwargs) -> Iterable[Any]:
48  """This method should return the result of an action performed on a
49  dataframe
50  """
51  raise NotImplementedError("This method should be overloaded in a subclass")
52 
53  @property
54  def columns(self) -> Iterable[str]:
55  """This property should return an iterable of columns needed by this action
56  """
57  raise NotImplementedError("This method should be overloaded in a subclass")
table::Key< int > id
Definition: Detector.cc:162