Functions as Objects, and persisting values

2007-11-05 Thread Falcolas
Please help me understand the mechanics of the following behavior.

 def d():
header = 'I am in front of '
def e(something):
print header + something
return e

 f = d()
 f('this')
I am in front of this
 del(d)
 f('this')
I am in front of this

The way I understand it, function d is an object, as is e. However I
don't quite grok the exact relationship between e and d. Is e
considered to be a subclass of 'd', so that it has access to it's
parent's __dict__ object, in order to access the value of 'header'? Or
is this persistence managed in a different fashion?

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


Re: Functions as Objects, and persisting values

2007-11-05 Thread Diez B. Roggisch
Falcolas schrieb:
 Please help me understand the mechanics of the following behavior.
 
 def d():
   header = 'I am in front of '
   def e(something):
   print header + something
   return e
 
 f = d()
 f('this')
 I am in front of this
 del(d)
 f('this')
 I am in front of this
 
 The way I understand it, function d is an object, as is e. However I
 don't quite grok the exact relationship between e and d. Is e
 considered to be a subclass of 'd', so that it has access to it's
 parent's __dict__ object, in order to access the value of 'header'? Or
 is this persistence managed in a different fashion?

The thing you observe here is a called a closure. It consists of the 
local variables surrounding e. So as long as you keep a reference to e, 
you keep one to the variables of d itself.

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


Re: Functions as Objects, and persisting values

2007-11-05 Thread Rich Harkins
[snip]
 The thing you observe here is a called a closure. It consists of the 
 local variables surrounding e. So as long as you keep a reference to e, 
 you keep one to the variables of d itself.
 
 Diez

More specifically though it keeps references to the requested variables
only:


def closed():
x = global_x
y = Y_VAR
def inner():
return y
return inner

class Destroyable(object):
def __del__(self):
print DESTROYED

global_x = Destroyable()
inner = closed()
print inner()
del global_x
print inner()
print HERE

You will get:

Y_VAR
DESTROYED
Y_VAR
HERE

If the entire dict of closed() was kept you would have seen:

Y_VAR
Y_VAR
HERE
DESTROYED

Since closed hadn't been destroyed yet: thus there was only one
reference remaining to global_x after closed() and inner() were called.

Rich

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


Re: Functions as Objects, and persisting values

2007-11-05 Thread Bruno Desthuilliers
Falcolas a écrit :
 Please help me understand the mechanics of the following behavior.
 
 
def d():
 
   header = 'I am in front of '
   def e(something):
   print header + something
   return e
 
 
f = d()
f('this')
 
 I am in front of this
 
del(d)
f('this')
 
 I am in front of this
 
 The way I understand it, function d is an object,

Right.

 as is e. 

Right.

 However I
 don't quite grok the exact relationship between e and d.
 
 Is e
 considered to be a subclass of 'd',

Nope.

 so that it has access to it's
 parent's __dict__ object, in order to access the value of 'header'? Or
 is this persistence managed in a different fashion?

As Diez said, it's called a lexical closure. A lexical closure is a 
function that captures and carries the lexical scope it was defined in 
with it - it 'closes over' it's environnement. Each time you call d, it 
returns a new function object (using the same code object) with a 
different environnement. You'll find this environement in f.func_closure.
-- 
http://mail.python.org/mailman/listinfo/python-list