[Tutor] "farkadoodle" or: unique global names, was Re: Data persistence problem

Steven D'Aprano steve at pearwood.info
Sat Jun 22 13:10:24 CEST 2013


On 22/06/13 17:04, Peter Otten wrote:
> This technique of nesting a function inside another function ("closure")

To be pedantic, not all nested functions are closures. Here's one which is not:


def outer(arg):
     def inner(x):
         return x + 1
     assert inner.__closure__ is None
     return inner(arg)


In this case, the inner function does not refer to any variables defined in the outer function. Instead, it is explicitly passed the value it needs as an argument.

Here's one which is a closure:


def outer(arg):
     def inner():
         return arg + 1
     assert inner.__closure__ is not None
     return inner()


The function attribute "__closure__" is set to None for regular functions. For closures, it is set to a bunch of stuff needed for the inner function to work correctly. (No user serviceable parts inside.) Basically, the inner function needs to carry around with it a little piece of its environment, so it can retrieve the value of "arg" when required.



-- 
Steven


More information about the Tutor mailing list