Calling Function Without Parentheses!

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Kamilche

    Calling Function Without Parentheses!

    What a debug nightmare! I just spent HOURS running my script through
    the debugger, sprinkling in log statements, and the like, tracking down
    my problem.

    I called a function without the ending parentheses. I sure do WISH
    Python would trap it when I try to do the following:
    MyFunc

    instead of:

    MyFunc()

    aaaaaaaaaaaah.

  • Skip Montanaro

    #2
    Re: Calling Function Without Parentheses!


    Kamilche> I called a function without the ending parentheses. I sure do
    Kamilche> WISH Python would trap it when I try to do the following:
    Kamilche> MyFunc

    Kamilche> instead of:

    Kamilche> MyFunc()

    Google for pychecker.

    Skip

    Comment

    • Dan Bishop

      #3
      Re: Calling Function Without Parentheses!

      Kamilche wrote:[color=blue]
      > What a debug nightmare! I just spent HOURS running my script through
      > the debugger, sprinkling in log statements, and the like, tracking[/color]
      down[color=blue]
      > my problem.
      >
      > I called a function without the ending parentheses. I sure do WISH
      > Python would trap it when I try to do the following:
      > MyFunc
      >
      > instead of:
      >
      > MyFunc()[/color]

      You're a former Pascal programmer, aren't you? ;-)

      In Python, it's not an error, because you can do things like:
      [color=blue][color=green][color=darkred]
      >>> def simpson(f, a, b):[/color][/color][/color]
      .... "Simpson's Rule approximation of the integral of f on [a, b]."
      .... return (b - a) * (f(a) + 4 * f((a + b) / 2.0) + f(b)) / 6.0
      ....[color=blue][color=green][color=darkred]
      >>> simpson(math.si n, 0.0, math.pi) # Note that math.sin is a function[/color][/color][/color]
      2.0943951023931 953

      Comment

      • John Machin

        #4
        Re: Calling Function Without Parentheses!

        Kamilche wrote:[color=blue]
        > What a debug nightmare! I just spent HOURS running my script through
        > the debugger, sprinkling in log statements, and the like, tracking[/color]
        down[color=blue]
        > my problem.
        >
        > I called a function without the ending parentheses. I sure do WISH
        > Python would trap it when I try to do the following:
        > MyFunc
        >
        > instead of:
        >
        > MyFunc()
        >
        > aaaaaaaaaaaah.[/color]

        Aaaaaaaaaaaah indeed. You must be using an extremely old version of
        pychecker. The version I have in my Python22 directory gave the same
        results as the current one; see below.

        C:\junk>type noparens.py
        [bangs inserted to defeat Google's lstrip()
        !def bar():
        ! foo
        !def foo():
        ! alist = []
        ! alist.sort



        C:\junk>pycheck er noparens.py

        C:\junk>c:\pyth on24\python.exe
        c:\python22\Lib \site-packages\pychec ker\checker.py noparens.py
        Processing noparens...

        Warnings...

        noparens.py:2: Statement appears to have no effect
        noparens.py:5: Statement appears to have no effect

        Comment

        • John Machin

          #5
          Re: Calling Function Without Parentheses!


          Dan Bishop wrote:[color=blue]
          > Kamilche wrote:[color=green]
          > > What a debug nightmare! I just spent HOURS running my script[/color][/color]
          through[color=blue][color=green]
          > > the debugger, sprinkling in log statements, and the like, tracking[/color]
          > down[color=green]
          > > my problem.
          > >
          > > I called a function without the ending parentheses. I sure do WISH
          > > Python would trap it when I try to do the following:
          > > MyFunc
          > >
          > > instead of:
          > >
          > > MyFunc()[/color]
          >
          > You're a former Pascal programmer, aren't you? ;-)
          >
          > In Python, it's not an error, because you can do things like:
          >[color=green][color=darkred]
          > >>> def simpson(f, a, b):[/color][/color]
          > ... "Simpson's Rule approximation of the integral of f on [a, b]."
          > ... return (b - a) * (f(a) + 4 * f((a + b) / 2.0) + f(b)) / 6.0
          > ...[color=green][color=darkred]
          > >>> simpson(math.si n, 0.0, math.pi) # Note that math.sin is a[/color][/color][/color]
          function[color=blue]
          > 2.0943951023931 953[/color]

          In Python, it's not an error, because functions are first class
          citizens. The OP's problem is evaluating an expression and then doing
          SFA with the result. Pychecker appears to be able to make the
          distinction; see below:

          C:\junk>type simpson.py
          import math
          def simpson(f, a, b):
          return (b - a) * (f(a) + 4 * f((a + b) / 2.0) + f(b)) / 6.0
          print simpson(math.si n, 0.0, math.pi)

          C:\junk>python simpson.py
          2.09439510239

          C:\junk>pycheck er simpson.py

          C:\junk>c:\pyth on24\python.exe
          c:\python22\Lib \site-packages\pychec ker\checker.py simpson.py
          Processing simpson...
          2.09439510239

          Warnings...

          None

          Comment

          • Kamilche

            #6
            Re: Calling Function Without Parentheses!

            Yep. Definitely time download PyChecker. Thanks for the tip!

            Comment

            • Terry Reedy

              #7
              Re: Calling Function Without Parentheses!


              "Kamilche" <klachemin@comc ast.net> wrote in message
              news:1104715584 .407505.190910@ f14g2000cwb.goo glegroups.com.. .[color=blue]
              > What a debug nightmare! I just spent HOURS running my script through
              > the debugger, sprinkling in log statements, and the like, tracking down
              > my problem.[/color]

              Did you try PyChecker? (Don't know if
              [color=blue]
              > I called a function without the ending parentheses.[/color]

              Which means you didn't call, and that was your problem ;-) In Python, the
              (...) pair in the appropriate context (where an operator is expected) *is*
              the infix/postfix call operator. It is equivalent to the call or gosub
              prefix in some other languages. The call operator works with any callable,
              not just function objects.
              [color=blue]
              >I sure do WISH Python would trap it when I try to do the following:[/color]

              trap = raise an exception? nooooh.
              [color=blue]
              > MyFunc
              > instead of:
              > MyFunc()[/color]

              In Python, non-keyword names resolve at runtime to the objects they are
              then bound to. This simple, uniform rule is, to me, part of the beauty of
              Python. There are lots of times that one wants to refer to a callable
              without calling it. Indeed, because Python separates referring to an
              object from calling the object, it can and does have a broader notion of
              'callable' than other languages. This includes the option of making
              instances of any user class callable (by including a __call__ method).

              Terry J. Reedy




              Comment

              • Max M

                #8
                Re: Calling Function Without Parentheses!

                Kamilche wrote:[color=blue]
                > What a debug nightmare! I just spent HOURS running my script through
                > the debugger, sprinkling in log statements, and the like, tracking down
                > my problem.
                >
                > I called a function without the ending parentheses. I sure do WISH
                > Python would trap it when I try to do the following:
                > MyFunc[/color]


                Actually you want use a method as an ordinary variable without calling
                it in many cases. It is often used in a dynamic language.

                A simple example is:

                result = []
                a = result.append
                if something:
                a('some result')
                elif something_else:
                a('another result')
                else:
                a('default result')

                --

                hilsen/regards Max M, Denmark


                IT's Mad Science

                Comment

                • Kamilche

                  #9
                  Re: Calling Function Without Parentheses!

                  Yeah, but still. If they even had the most basic check, like 'an object
                  is being referred to on this line, but you're not doing anything with
                  it' would be handy in catching that. When you use an object like that,
                  usually you're doing something with it, like assigning it to a variable.

                  Comment

                  • Jeff Shannon

                    #10
                    Re: Calling Function Without Parentheses!

                    Kamilche wrote:
                    [color=blue]
                    > Yeah, but still. If they even had the most basic check, like 'an object
                    > is being referred to on this line, but you're not doing anything with
                    > it' would be handy in catching that. When you use an object like that,
                    > usually you're doing something with it, like assigning it to a variable.
                    >[/color]

                    In many cases, however, it's not possible to distinguish this.

                    def get_pi():
                    import math
                    return math.pi

                    print my_func(get_pi)

                    Now, am I trying to pass the function object get_pi into my_func(), or
                    do I want to call get_pi() and pass the return value?

                    There are also many times when it's sensible to do nothing with an
                    object reference -- i.e. ignoring the return value of a function which
                    you're calling for its side-effects.

                    It seems to me that it's reasonable for the Python interpreter to
                    *not* attempt to guess at whether a questionable usage is an error or
                    not. Better to have that done by a developer tool (pychecker) than
                    through runtime checks every time the program is used.

                    Jeff Shannon
                    Technician/Programmer
                    Credit International

                    Comment

                    • Kamilche

                      #11
                      Re: Calling Function Without Parentheses!

                      Uh, you're right! I wouldn't want to bog Python down with even more
                      checking at run time. I guess I'm asking for syntax checks that are
                      typically done only with compiled languages.

                      It doesn't stop me from using Python, though! Since I don't have syntax
                      checking, I find I have to test supporting routines thoroughly, to make
                      sure it errs when it should err and runs when it should run. That's
                      something that's always good to do, but it's especially useful in
                      Python, which has no syntax checking before runtime.

                      Comment

                      • Nick Coghlan

                        #12
                        Re: Calling Function Without Parentheses!

                        Kamilche wrote:[color=blue]
                        > Uh, you're right! I wouldn't want to bog Python down with even more
                        > checking at run time. I guess I'm asking for syntax checks that are
                        > typically done only with compiled languages.[/color]

                        In that case, I can suggest having a look at Pychecker, which performs static
                        sanity checks on Python code.


                        Cheers,
                        Nick.

                        --
                        Nick Coghlan | ncoghlan@email. com | Brisbane, Australia
                        ---------------------------------------------------------------

                        Comment

                        Working...