What should a decorator do if an attribute already exists?
Peter Otten
__peter__ at web.de
Tue May 10 12:46:02 EDT 2016
Steven D'Aprano wrote:
> I have a decorator that adds an attribute to the decorated function:
>
>
> def decorate(func):
> instrument = make_instrument()
>
> @functools.wraps(func)
> def inner(*args):
> instrument.start()
> result = func(*args)
> instrument.finish()
> return result
>
> inner.instrument = instrument
> return inner
>
>
> The actual nature of the instrumentation isn't important: depending on the
> decorator, it might count the number of function calls made, how long it
> takes, count cache hits, or something else.
>
> My question is, what should I do if the decorated function already has an
> instrument attribute?
>
> 1. raise an exception?
>
> 2. raise a warning, and over-write the attribute?
> 3. raise a warning, and skip adding the attribute?
> 4. raise a warning, and rename the existing instrument to
> something else before writing my own instrument?
>
> 5. silently over-write the attribute?
>
>
> I think 5 is clearly wrong, 4 is too difficult, and 3 seems pointless. So
> I think either 1 or 2 is the right thing to do.
>
> Thoughts?
Silently overwrite it. For
@decorate
@decorate
def f():
pass
the original instrument is still accessible as f.__wrapped__.instrument, so
5 is the easy way to get 4.
More information about the Python-list
mailing list