lump.decorators module

class lump.decorators.DeferredStr(func)[source]

Bases: object

Simple helper class to defer the execution of formatting functions until it is needed

lump.decorators.cache(cacher=None)[source]

Usage:

>>> @cache()
... def test():
...   print('test')
...   return 'result'
>>>
>>> test()
test
'result'
>>> test()
'result'
lump.decorators.classcache(f)[source]

Usage:

>>> class SomeClass:
...     def __init__(self):
...         self._call_count = 0
...         self._cacher = None
...
...     @classcache
...     def someFunc(self):
...         self._call_count += 1
...         return self._call_count
>>> # no class cacher set...
>>> cls = SomeClass()
>>> cls.someFunc()
1
>>> cls.someFunc()
2
>>>
>>> class SomeClassWithCacher(SomeClass):
...     def __init__(self):
...         super().__init__()
...         self._cacher = LocalCacher()
...
...     def get_cacher(self):
...         return self._cacher
>>> # with a class cacher set
>>> cls = SomeClassWithCacher()
>>> cls.someFunc()
1
>>> cls.someFunc()
1
lump.decorators.exception_redirect(new_exception_class, old_exception_class=<class 'Exception'>, logger=None)[source]

Decorator to replace a given exception to another Exception class, with optional exception logging.

>>>
>>> class MyException(Exception):
...     pass
>>>
>>> @exception_redirect(MyException)
... def test():
...    raise Exception("test")
>>>
>>> test()
Traceback (most recent call last):
...
lump.decorators.MyException: test
lump.decorators.log_call(logger: logging.Logger, log_level=None, result=None)[source]

Decorator to log all calls to decorated function to given logger

>>> import logging, sys, io
>>>
>>> logger = logging.getLogger('logger_name')
>>> logger.setLevel(logging.DEBUG)
>>> ch = logging.StreamHandler(sys.stdout)
>>> ch.setFormatter(logging.Formatter('%(levelname)s:%(name)s: %(message)s'))
>>> logger.addHandler(ch)
>>>
>>> @log_call(logger, logging.WARNING)
... def test(*args, **kwargs):
...     return 'result'
>>> test('arg1', arg2='someval', arg3='someotherval')
WARNING:logger_name: test('arg1', arg2='someval', arg3='someotherval')
'result'
>>> @log_call(logger, result=True)
... def test(*args, **kwargs):
...     return 'result'
>>> test(arg2='someval', arg3='someotherval')
DEBUG:logger_name: test(arg2='someval', arg3='someotherval')
DEBUG:logger_name: test returned: result
'result'
lump.decorators.memoize(f, cacher=None)[source]

Usage:

>>> called = 0
>>> @memoize
... def someFunc():
...     global called
...     called += 1
...     return called
>>>
>>> someFunc()
1
>>> someFunc()
1
lump.decorators.retry(tries=5, logger=None, sleep=None)[source]

Automagically retry the action

>>> times = 0
>>> @retry(5, logger=None)
... def a(n):
...     global times
...     times += 1
...     if times < n:
...        raise Exception("nope")
...     success = times
...     times = 0
...     return success
>>> a(4)
4
>>> a(0)
1
>>> a(1)
1
>>> a(5)
5
>>> a(6)
Traceback (most recent call last):
...
Exception: nope