Here is the code I'm working with:
from contextlib import contextmanager
from functools import wraps
class with_report_status(object):def __init__(self, message):self.message = messagedef __call__(self, f):@wraps(f)def wrapper(_self, *a, **kw):try:return f(_self, *a, **kw)except:log.exception("Handling exception in reporting operation")if not (hasattr(_self, 'report_status') and _self.report_status):_self.report_status = self.messageraisereturn wrapperclass MyClass(object):@contextmanager@with_report_status('unable to create export workspace')def make_workspace(self):temp_dir = tempfile.mkdtemp()log.debug("Creating working directory in %s", temp_dir)self.workspace = temp_diryield self.workspacelog.debug("Cleaning up working directory in %s", temp_dir)shutil.rmtree(temp_dir)@with_report_status('working on step 1')def step_one(self):# do something that isn't a context manager
The problem is, @with_report_status
does not yield, as expected by @contextmanager
. However, I can't wrap it the other way around either, because @contextmanager
returns a generator object (i think!) instead of the value itself.
How can I make @contextmanager
play nice with decorators?