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