From 83d4c6394b59b5ffc77fd3e7a2a6dc51ca7b3e55 Mon Sep 17 00:00:00 2001
From: Pauli Virtanen <pauli.t.virtanen@jyu.fi>
Date: Wed, 21 Sep 2022 15:35:07 +0300
Subject: [PATCH] Improve with_log_level

---
 usadelndsoc/__init__.py | 28 +++++++++++++---------------
 1 file changed, 13 insertions(+), 15 deletions(-)

diff --git a/usadelndsoc/__init__.py b/usadelndsoc/__init__.py
index 85ea542..1a74608 100644
--- a/usadelndsoc/__init__.py
+++ b/usadelndsoc/__init__.py
@@ -1,6 +1,7 @@
 # -*- coding:utf-8; eval: (blacken-mode) -*-
 
 import logging
+import contextlib
 
 
 logger = logging.getLogger(__name__)
@@ -35,23 +36,20 @@ def _init_logging():
     logging.config.dictConfig(cfg)
 
 
-def with_log_level(level):
-    import functools
+class with_log_level(contextlib.ContextDecorator):
+    def __init__(self, level, old_level=None):
+        self._level = level
+        self._old_level = old_level
 
-    def deco(func):
-        @functools.wraps(func)
-        def wrapper(*a, **kw):
-            old_level = int(logger.level)
-            logger.setLevel(level)
-            try:
-                return func(*a, **kw)
-            finally:
-                logger.setLevel(old_level)
+    def __enter__(self):
+        cm = with_log_level(self._level, int(logger.level))
+        logger.setLevel(cm._level)
+        return cm
 
-        return wrapper
-
-    return deco
+    def __exit__(self, *exc):
+        logger.setLevel(self._old_level)
+        return False
 
 
 _init_logging()
-del _init_logging, logging
+del _init_logging, logging, contextlib
-- 
GitLab