Skip to content

Instantly share code, notes, and snippets.

@chiragjn
Created April 21, 2020 09:25
Show Gist options
  • Save chiragjn/72ef7553ee2eb42051d56d91cf944035 to your computer and use it in GitHub Desktop.
Save chiragjn/72ef7553ee2eb42051d56d91cf944035 to your computer and use it in GitHub Desktop.
An example of single callable that works as both a contextmanager and a decorator
import logging
import sys
import contextlib
from timeit import default_timer as timer
from typing import Any
root = logging.getLogger()
root.setLevel(logging.DEBUG)
handler = logging.StreamHandler(sys.stdout)
handler.setLevel(logging.DEBUG)
formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
root.addHandler(handler)
class log_time(contextlib.ContextDecorator):
def __init__(self, logger, level='info', event=None):
self.logger = logger
self.level = level
self.event = event
def __enter__(self):
self.start = timer()
getattr(self.logger, self.level.lower(),
'info')(f'{self.event} started')
def __exit__(self, *exc):
getattr(self.logger, self.level.lower(), 'info')(
f'{self.event} finished. Took {timer() - self.start:.3f} seconds')
def __call__(self, func):
self.event = func.__qualname__
return super().__call__(func)
@log_time(logger=root)
def log_time_for_log_time(who):
print(f' >>>>>>> {who} <<<<<<< ')
if __name__ == '__main__':
with log_time(logger=root, event='log time for log_time_for_log_time'):
log_time_for_log_time('tester')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment