On 11/21/2011 10:35 AM, Andrea Crotti wrote:
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?


You didn't mention what version of Python you're running. With Python 2, I got very different results. So I switched to Python 3.2, and I still don't get exactly what you have.

A closure is needed if there's some non-global data outside the function definition (code object) that's needed by the function object. As you supply the code I don't need a closure. But if I add a local variable in test_decorate(), and refer to it in dec(), then I get one. Not the same as yours.

You left out the import and the definition line for test_decorate. Did you leave anything else? And what version of Python are you using? Are you perhaps running in a shell, as opposed to running code directly from a source file?



--

DaveA
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to