How can I mix decorators with the @contextmanager decorator?

2024/9/16 22:48:03

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?

Answer

Try moving @contextmanager at the bottom of the decorator list.

https://en.xdnf.cn/q/72236.html

Related Q&A

supervisord always returns exit status 127 at WebFaction

I keep getting the following errors from supervisord at webFaction when tailing the log:INFO exited: my_app (exit status 127; not expected) INFO gave up: my_app entered FATAL state, too many start retr…

One dimensional Mahalanobis Distance in Python

Ive been trying to validate my code to calculate Mahalanobis distance written in Python (and double check to compare the result in OpenCV) My data points are of 1 dimension each (5 rows x 1 column). I…

DeprecationWarning: please use dns.resolver.Resolver.resolve()

I am using resolver() as an alternative to socket() as I found that when multiple connections are made to different IPs it ends up stopping working. Anyway it returns a warning to me that I should use …

python cannot find module when using ssh

Im using python on servers. When I run a python command which needs numpy module, if I do ssh <server name> <python command>that server will complain no module named numpy found.However, if…

Python sklearn installation windows

When trying to install Pythons sklearn package on Windows 10 using pip I am given an EnvironmentError that tells me there is no such file or directory of a specific file: ERROR: Could not install packa…

Python PSD layers?

I need to write a Python program for loading a PSD photoshop image, which has multiple layers and spit out png files (one for each layer). Can you do that in Python? Ive tried PIL, but there doesnt se…

Multiple inheritance: overridden methods containing super()-calls

With the file super5.py:class A:def m(self):print("m of A called")class B(A):def m(self):print("m of B called")super().m()class C(A):def m(self):print("m of C called")supe…

Specifying the output file name in Apache Spark

I have a MapReduce job that Im trying to migrate to PySpark. Is there any way of defining the name of the output file, rather than getting part-xxxxx?In MR, I was using the org.apache.hadoop.mapred.li…

How to plot two DataFrame on same graph for comparison

I have two DataFrames (trail1 and trail2) with the following columns: Genre, City, and Number Sold. Now I want to create a bar graph of both data sets for a side by side comparison of Genre vs. total N…

Babel doesnt recognize jinja2 extraction method for language support

Im adding language translation support to my project. The code is on Python and has jinja2 in the html files, and Javascript.Im trying to use Babel to do the translation, but it doesnt recognize the ex…