Hide keyboard shortcuts

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 

2 

3__all__ = ("DataFrameAction",) 

4 

5from lsst.pex.config import Field, ListField 

6from typing import Iterable, Any, Mapping 

7 

8from ..configurableActions import ConfigurableAction 

9 

10 

11class DataFrameAction(ConfigurableAction): 

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 = {} 

22 

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) 

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")