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
    #1
    1. Advertising

  2. Kent Johnson Guest

    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
    #2
    1. Advertising

  3. 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
    #3
  4. 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
    #4
  5. <> 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
    #5
  6. 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
    #6
  7. 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
    #7
  8. 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
    #8
  9. 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
    #9
    1. Advertising

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.
Similar Threads
  1. Russ Perry Jr
    Replies:
    2
    Views:
    4,292
    Russ Perry Jr
    Aug 20, 2004
  2. Xiangliang Meng
    Replies:
    1
    Views:
    1,663
    Victor Bazarov
    Jun 21, 2004
  3. Chad E. Dollins
    Replies:
    3
    Views:
    683
    Kai-Uwe Bux
    Nov 8, 2005
  4. request@no_spam.com
    Replies:
    5
    Views:
    458
  5. Ultrus
    Replies:
    3
    Views:
    413
    Stefan Behnel
    Jul 9, 2007
Loading...

Share This Page