[Python-Dev] Re: closure semantics

David Eppstein eppstein at ics.uci.edu
Wed Oct 22 19:03:06 EDT 2003


In article <5.2.1.1.0.20031022191732.0280ce10 at pop.bluewin.ch>,
 Samuele Pedroni <pedronis at bluewin.ch> wrote:

> why exactly do we want write access to outer scopes?
> 
> for completeness, to avoid the overhead of introducing a class here and there,
> to facilitate people using Scheme textbooks with Python?

I am currently working on implementing an algorithm with the following 
properties:
 - It is an algorithm, not a data structure; that is, you run it,
   it returns an answer, and it doesn't leave any persistent state
   afterwards.
 - It is sufficiently complex that I prefer to break it into several
   different functions or methods.
 - These functions or methods need to share various state variables.

If I implement it as a collection of separate functions, then there's a 
lot of unnecessary code complexity involved in passing the state 
variables from one function to the next, returning the changes to the 
variables, etc.  Also, it doesn't present a modular interface to the 
rest of the project -- code outside this algorithm is not prevented from 
calling the internal subroutines of the algorithm.

If I implement it as a collection of methods of an object, I then have 
to include a separate function which creates an instance of the object 
and immediately destroys it.  This seems clumsy and also doesn't fit 
with my intuition about what objects are for (representing persistent 
structure).  Also, again, modularity is violated -- outside code should 
not be making instances of this object or accessing its methods.

What I would like to do is to make an outer function, which sets up the 
state variables, defines inner functions, and then calls those 
functions.  Currently, this sort of works: most of the state variables 
consist of mutable objects, so I can mutate them without rebinding them.  
But some of the state is immutable (in this case, an int) so I need to 
somehow encapsulate it in mutable objects, which is again clumsy.
Write access to outer scopes would let me avoid this encapsulation 
problem.

-- 
David Eppstein                      http://www.ics.uci.edu/~eppstein/
Univ. of California, Irvine, School of Information & Computer Science




More information about the Python-Dev mailing list