nested functions

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • micklee74@hotmail.com

    #1

    nested functions

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

  • Kent Johnson

    #2
    Re: nested functions

    micklee74@hotma il.com wrote:[color=blue]
    > 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() ??[/color]

    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

    Comment

    • Szabolcs Berecz

      #3
      Re: nested functions

      On 14 Apr 2006 04:37:54 -0700, micklee74@hotma il.com
      <micklee74@hotm ail.com> wrote:[color=blue]
      > def a():
      > def b():
      > print "b"
      > def c():
      > print "c"
      >
      > how can i call c() ??[/color]

      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

      Comment

      • Fredrik Lundh

        #4
        Re: nested functions

        micklee74@hotma il.com wrote:
        [color=blue]
        > just curious , if i have a code like this?
        >
        > def a():
        > def b():
        > print "b"
        > def c():
        > print "c"
        >
        > how can i call c() ??[/color]

        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>



        Comment

        • Thomas Bartkus

          #5
          Re: nested functions

          <micklee74@hotm ail.com> wrote in message
          news:1145014674 .717433.75100@t 31g2000cwb.goog legroups.com...[color=blue]
          > 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() ??[/color]

          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


          Comment

          • Fredrik Lundh

            #6
            Re: nested functions

            Thomas Bartkus wrote:
            [color=blue]
            > I, for one, am so glad to have nested functions again ;-)[/color]

            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>



            Comment

            • bruno at modulix

              #7
              Re: nested functions

              Szabolcs Berecz wrote:[color=blue]
              > On 14 Apr 2006 04:37:54 -0700, micklee74@hotma il.com
              > <micklee74@hotm ail.com> wrote:
              >[color=green]
              >>def a():
              >> def b():
              >> print "b"
              >> def c():
              >> print "c"
              >>
              >>how can i call c() ??[/color]
              >
              >
              > 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[/color]

              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 'onurb@xiludom. gro'.split('@')])"

              Comment

              • Lawrence D'Oliveiro

                #8
                Re: nested functions

                In article <tv-dnXWdvtN4MqLZRV n-gA@telcove.net> ,
                "Thomas Bartkus" <thomasbartkus@ comcast.net> wrote:
                [color=blue]
                >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.[/color]

                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.

                Comment

                • Fredrik Lundh

                  #9
                  Re: nested functions

                  Lawrence D'Oliveiro wrote:
                  [color=blue][color=green]
                  > >BUT 'b' and 'c' simply do not exist outside the 'a' world.[/color]
                  >
                  > 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.[/color]

                  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>



                  Comment

                  Working...