Source code for jammy.utils.cnt

# Consider thread safe and singleton pattern
import inspect
from collections import defaultdict

__all__ = ["BufferCnt", "CBCnt", "ExitCnt", "bufcnt"]

g_caller_cnt = defaultdict(lambda: 0)


[docs]def bufcnt(cond): frames = inspect.stack() hash_info = "".join( [f"{cur_st.filename}{cur_st.lineno}\n" for cur_st in frames[1:]] ) g_caller_cnt[hash_info] = g_caller_cnt[hash_info] * cond + cond return g_caller_cnt[hash_info]
[docs]class BufferCnt: def __init__(self, thres=float("inf"), reset_over_thres=False): self._cnt = 0 self.thres = thres self.reset_over_thres = reset_over_thres def __call__(self, expre, thres=None): if expre is True: self._cnt += 1 else: self._cnt = 0 if thres is None: thres = self.thres if self._cnt > self.thres: if self.reset_over_thres: self.reset() return True return False @property def cnt(self): return self._cnt
[docs] def reset(self): self._cnt = 0
[docs]class CBCnt(BufferCnt): def __init__(self, cb_fn=None, thres=float("inf"), reset_over_thres=False): super().__init__(thres, reset_over_thres=reset_over_thres) self.call_back = cb_fn def __call__(self, expre, thres=None, *args, **kwargs): is_thres = super().__call__(expre, thres) if is_thres and self.call_back is not None: self.call_back(*args, **kwargs)
[docs]class ExitCnt(CBCnt): def __init__( self, msg="Something wrong", thres=float("inf"), reset_over_thres=False ): def _exit_fn(): print(msg) import sys sys.exit() super().__init__(_exit_fn, thres, reset_over_thres)