decorators only when __debug__ == True
Stephen Hansen
apt.shansen at gmail.invalid
Wed Mar 31 17:28:27 EDT 2010
On 2010-03-31 13:59:01 -0700, LX said:
>> pass_decorator will be called when the decorated function is _defined_,
>> but not when the decorated function is _called_.
>
> Why is it then that during runtime, with a breakpoint in some
> arbitrary main() in main.py, I get something similar to the following
> call stack:
>
> main.py, line xxx, in <module>
> main()
>
> <string>, line 2, in main
>
> decorator.py, line 261, in pass_decorator
> return f(*args, **kw)
>
> main.py, line yyy, in main()
> * breakpoint line here *
>
> It looks to me the call stack still includes the additional level of
> the decorator... what am I missing? Thank you for your time.
You're not defining pass_decorator correctly. Always show us the actual
code when you're showing results.
Your pass_decorator should just return the original function,
undecorated, unmodified if you're not in debug. It should only return a
decorated function otherwise.
Consider:
-----
from decorator import decorator
def debug_decorator(fn):
if __debug__:
def wrapper(fn, *args, **kwargs):
# insert pre-condition testing here
if len(args) != 1:
raise ValueError("Incorrect number of arguments")
result = fn(*args, **kwargs)
# insert post-condition testing here
if result not in (True, False):
raise ValueError("Incorrect return value!")
return result
return decorator(wrapper, fn)
else:
return fn
@debug_decorator
def my_test(arg):
if not arg:
raise RuntimeError
return True
my_test(0)
-----
And the output depending on if you're in debug mode or not:
Top:test ixokai$ python deco.py
Traceback (most recent call last):
File "deco.py", line 27, in <module>
my_test(0)
File "<string>", line 2, in my_test
File "deco.py", line 10, in wrapper
result = fn(*args, **kwargs)
File "deco.py", line 24, in my_test
raise RuntimeError
RuntimeError
Top:test ixokai$ python -O deco.py
Traceback (most recent call last):
File "deco.py", line 27, in <module>
my_test(0)
File "deco.py", line 24, in my_test
raise RuntimeError
RuntimeError
--
--S
... p.s: change the ".invalid" to ".com" in email address to reply privately.
More information about the Python-list
mailing list