From: Vedran on
Hello!

Is it possible to apply a decorator on a block of code, without defining
a function that decorator is applied to.

I have to generate a lot of similar graphs. For that reason I use
plot_decorator to perform usual figure setup(outfile, legend, x_label,
y_label and so on), and pylab.plot commands to do the actual plotting.

Current solution:

@plot_decorator(fig_params1)
def plt():
pylab.plot(..first graph data...)
pylab.plot(..second graph data..)
plt()

Is it possible to apply decorator only to the body of plt (several
pylab.plot commands) without actually defining this function, because I
use it only once, right after the definition?
From: Peter Otten on
Vedran wrote:

> Hello!
>
> Is it possible to apply a decorator on a block of code, without defining
> a function that decorator is applied to.

You can only decorate functions or classes.

> I have to generate a lot of similar graphs. For that reason I use
> plot_decorator to perform usual figure setup(outfile, legend, x_label,
> y_label and so on), and pylab.plot commands to do the actual plotting.
>
> Current solution:
>
> @plot_decorator(fig_params1)
> def plt():
> pylab.plot(..first graph data...)
> pylab.plot(..second graph data..)
> plt()
>
> Is it possible to apply decorator only to the body of plt (several
> pylab.plot commands) without actually defining this function, because I
> use it only once, right after the definition?

I have a hunch that a contextmanager is a better match for your
requirements, see

http://docs.python.org/library/contextlib.html#contextlib.contextmanager

Peter
From: Gregory Ewing on
Vedran wrote:

> @plot_decorator(fig_params1)
> def plt():
> pylab.plot(..first graph data...)
> pylab.plot(..second graph data..)
> plt()

You could do something like

def call(f):
f()

@call
@plot_decorator(fig_params1)
def plt():
pylab.plot(..first graph data...)
pylab.plot(..second graph data..)

--
Greg