Understanding closures

James Stroud jstroud at mbi.ucla.edu
Sun Aug 19 04:27:46 EDT 2007


Ramashish Baranwal wrote:
> Hi,
> 
> I want to use variables passed to a function in an inner defined
> function. Something like-
> 
> def fun1(method=None):
>     def fun2():
>         if not method: method = 'GET'
>         print '%s: this is fun2' % method
>         return
>     fun2()
> 
> fun1()
> 
> However I get this error-
> UnboundLocalError: local variable 'method' referenced before
> assignment
> 
> This however works fine.
> 
> def fun1(method=None):
>     if not method: method = 'GET'
>     def fun2():
>         print '%s: this is fun2' % method
>         return
>     fun2()
> 
> fun1()
> 
> Is there a simple way I can pass on the variables passed to the outer
> function to the inner one without having to use or refer them in the
> outer function?

Why do you have this latter requirement? Will /method/ change in the 
outer scope before it is called in the inner scope? E.g.:


def fun1(method=None):
     def fun2():
         if not method: method = 'GET'
         print '%s: this is fun2' % method
         return
     method = 'POST'
     # Now its going to be 'POST' in fun2
     fun2()


To avoid this problem, you want something like this:


def fun1(method=None):
     def fun2(method=method):
         if not method: method = 'GET'
         print '%s: this is fun2' % method
         return
     method = 'POST'
     # Now the preceding line has no effect on fun2
     fun2()
     # Now method is explicitly 'POST' in fun2
     fun2('POST')


But a deeper question is: Why do you need to define fun2 with fun1 to 
begin with?


def fun2(method=None):
   if not method: method = 'GET'
   print '%s: this is fun2' % method
   return

def fun1(method=None):
   method = 'POST'
   # will be 'GET'
   fun2()
   # will be 'POST'
   fun2(method)


Also, empty "return" statements are unnecessary if they are the last 
statement in a function.

James



More information about the Python-list mailing list