# nested functions

Discussion in 'Python' started by micklee74@hotmail.com, Apr 14, 2006.

1. ### Guest

hi
just curious , if i have a code like this?

def a():
def b():
print "b"
def c():
print "c"

how can i call c() ??

, Apr 14, 2006

2. ### Kent JohnsonGuest

wrote:
> hi
> just curious , if i have a code like this?
>
> def a():
> def b():
> print "b"
> def c():
> print "c"
>
> how can i call c() ??

c is a name in the local scope of a(). You can call c from within a,
where the name is in scope, or you can return c or in some other way
make the value available in some other scope:

In [5]: def a():
...: def c():
...: print 'called c'
...: c()
...: return c
...:

In [6]: cc=a()
called c

In [7]: cc()
called c

Kent

Kent Johnson, Apr 14, 2006

3. ### Szabolcs BereczGuest

On 14 Apr 2006 04:37:54 -0700,
<> wrote:
> def a():
> def b():
> print "b"
> def c():
> print "c"
>
> how can i call c() ??

Function c() is not meant to be called from outside function a().
That's what a nested function is for: localizing it's usage and
prevent cluttering the global namespace

Szabi

Szabolcs Berecz, Apr 14, 2006
4. ### Fredrik LundhGuest

wrote:

> just curious , if i have a code like this?
>
> def a():
> def b():
> print "b"
> def c():
> print "c"
>
> how can i call c() ??

in the same way as you'd access the variable "c" in this example:

def a():
c = 10

(that is, by calling the function and accessing the local variable "c"
from the inside. in both cases, "c" lives in the local namespace, and
doesn't exist at all unless you call the function).

</F>

Fredrik Lundh, Apr 14, 2006
5. ### Thomas BartkusGuest

<> wrote in message
news:...
> hi
> just curious , if i have a code like this?
>
> def a():
> def b():
> print "b"
> def c():
> print "c"
>
> how can i call c() ??

Your function 'a' is it's own little world where functions 'b' and 'c'
exist.
Your code inside 'a' can call 'b' or 'c' - neat as you please.

BUT 'b' and 'c' simply do not exist outside the 'a' world. This is perfect
because you are in control - building worlds according to your own design.
Had it not been your intention to hide 'b' and 'c', you would not have
isolated them in this manner inside of 'a' .

I, for one, am so glad to have nested functions again ;-)
Thomas Bartkus

Thomas Bartkus, Apr 14, 2006
6. ### Fredrik LundhGuest

Thomas Bartkus wrote:

> I, for one, am so glad to have nested functions again ;-)

again ?

Python has always supported nested functions. it's the scoping rules
that have changed; before the change from LGB to LEGB, you had to
explictly import objects from outer scopes.

</F>

Fredrik Lundh, Apr 14, 2006
7. ### bruno at modulixGuest

Szabolcs Berecz wrote:
> On 14 Apr 2006 04:37:54 -0700,
> <> wrote:
>
>>def a():
>> def b():
>> print "b"
>> def c():
>> print "c"
>>
>>how can i call c() ??

>
>
> Function c() is not meant to be called from outside function a().
> That's what a nested function is for: localizing it's usage and
> prevent cluttering the global namespace

There's actually more than this about Python's nested functions: they
can be returned from the outer function and then carry the environnement
in which they where created:

def trace(func):
fname = func.__name__

def traced(*args, **kw):
print "calling func %s with *%s, **%s" % (fname, str(args), kw)
try:
result = func(*args, **kw)
except Exception, e:
print "%s raised %s" % (fname, e)
raise
else:
print "%s returned %s" % (fname, str(result))
return result

return traced

def test(arg1, arg2='parrot'):
print "in test, arg1 is %s" % arg1
return arg2 * 3

test = trace(test)
test(42)

--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"

bruno at modulix, Apr 14, 2006
8. ### Lawrence D'OliveiroGuest

In article <>,
"Thomas Bartkus" <> wrote:

>Your function 'a' is it's own little world where functions 'b' and 'c'
>exist.
>Your code inside 'a' can call 'b' or 'c' - neat as you please.
>
>BUT 'b' and 'c' simply do not exist outside the 'a' world.

It's worth distinguishing between the _names_ 'b' and 'c' and the
_functions_ referred to by those names. The _names_ certainly do not
exist outside of the scope of the function referred to by 'a' (any
occurrences of 'b' and 'c' outside that scope refer to _different_
names), but the _functions_ they refer to certainly do exist.

Lawrence D'Oliveiro, Apr 14, 2006
9. ### Fredrik LundhGuest

Lawrence D'Oliveiro wrote:

> >BUT 'b' and 'c' simply do not exist outside the 'a' world.

>
> It's worth distinguishing between the _names_ 'b' and 'c' and the
> _functions_ referred to by those names. The _names_ certainly do not
> exist outside of the scope of the function referred to by 'a' (any
> occurrences of 'b' and 'c' outside that scope refer to _different_
> names), but the _functions_ they refer to certainly do exist.

that's a bit misleading. "def" is an executable statement, and it
*creates* a function object when it's executed. that object is
handled in exactly the same way as any other object.

in the following example, the function referred to by "c" doesn't
exist before a call to "a", and it doesn't exist after the function
has returned:

def a():
def c():
print "c"
c()

if you call the function again, a new function object is created.

</F>

Fredrik Lundh, Apr 15, 2006

## Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.