nested functions

M

micklee74

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() ??
 
K

Kent Johnson

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
 
S

Szabolcs Berecz

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
 
F

Fredrik Lundh

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>
 
T

Thomas Bartkus

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
 
F

Fredrik Lundh

Thomas said:
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>
 
B

bruno at modulix

Szabolcs said:
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)
 
L

Lawrence D'Oliveiro

"Thomas Bartkus said:
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.
 
F

Fredrik Lundh

Lawrence said:
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>
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top