Created
April 21, 2020 09:25
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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