On 11/21/2011 03:06 PM, Dave Angel wrote:
Your function 'nested' isn't nested, 'fun' is. What you discovered is
that a decorator is always executed, every time a nested decorated
function is defined.
You've also ust proved that it would be an incompatible change.
Doesn't that answer the question? An optimizer that changes the
behavior isn't usually desirable.
Yes sure I think it makes perfectly sense, because you actually redefine
a local variable every time..
Another thing (which was also the reason of the subject), I tried to
disassemble the following:
def dec(fn):
def _dec():
fn()
return _dec
@dec
def fun():
print("here")
fun()
And I get this:
In [29]: dis.dis(test_decorate)
Disassembly of dec:
2 0 LOAD_CLOSURE 0 (fn)
3 BUILD_TUPLE 1
6 LOAD_CONST 1 (<code object _dec at
0x1c4b930, file "test_decorate.py", line 2>)
9 MAKE_CLOSURE 0
12 STORE_FAST 1 (_dec)
5 15 LOAD_FAST 1 (_dec)
18 RETURN_VALUE
Disassembly of fun:
3 0 LOAD_DEREF 0 (fn)
3 CALL_FUNCTION 0
6 POP_TOP
7 LOAD_CONST 0 (None)
10 RETURN_VALUE
Looking up the definition of the single calls didn't help much, so why
do we need
for example MAKE_CLOSURE?
Is MAKE_CLOSURE just more generic maybe?
--
http://mail.python.org/mailman/listinfo/python-list