inspect feature

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Aaron \Castironpi\ Brady

    #1

    inspect feature

    Hello,

    The 'inspect' module has this method:

    inspect.getargv alues(frame)

    It takes a frame and returns the parameters used to call it, including
    the locals as defined in the frame, as shown.
    >>def f( a, b, d= None, *c, **e ):
    .... import inspect
    .... return inspect.getargv alues( inspect.current frame() )
    ....
    >>f( 0, 1, 'abc', 'def', ( 3, 2 ), h= 'ghi' )
    (['a', 'b', 'd'], 'c', 'e', {'a': 0, 'c': ('def', (3, 2)), 'b': 1,
    'e': {'h': 'g
    hi'}, 'd': 'abc', 'inspect': <module 'inspect' from 'C:\Programs
    \Python26\lib\i n
    spect.pyc'>})

    However, if you wanted a decorator that examines the parameters to a
    function, you're out of luck. By the time you have a frame, you're
    already in the function.

    Perhaps it would not be as common as something like 'join' for
    example, or even the rest of the functions in 'inspect', but do you
    think something similar to 'getargvalues' that accepted a function and
    an argument list, and returned a dictionary mapping parameters to
    values, could be useful?

  • Bruno Desthuilliers

    #2
    Re: inspect feature

    Aaron "Castironpi " Brady a écrit :
    Hello,
    >
    The 'inspect' module has this method:
    >
    inspect.getargv alues(frame)
    >
    It takes a frame and returns the parameters used to call it, including
    the locals as defined in the frame, as shown.
    >
    >>>def f( a, b, d= None, *c, **e ):
    ... import inspect
    ... return inspect.getargv alues( inspect.current frame() )
    ...
    >>>f( 0, 1, 'abc', 'def', ( 3, 2 ), h= 'ghi' )
    (['a', 'b', 'd'], 'c', 'e', {'a': 0, 'c': ('def', (3, 2)), 'b': 1,
    'e': {'h': 'g
    hi'}, 'd': 'abc', 'inspect': <module 'inspect' from 'C:\Programs
    \Python26\lib\i n
    spect.pyc'>})
    >
    However, if you wanted a decorator that examines the parameters to a
    function, you're out of luck. By the time you have a frame, you're
    already in the function.
    Hem...

    def decorator(func) :
    def _decorator(*arg s, *kw):
    print "func args are ", *args, **kw
    return func(*args, **kw)
    return _decorator


    Comment

    • Aaron \Castironpi\ Brady

      #3
      Re: inspect feature

      On Oct 9, 3:48 am, Bruno Desthuilliers <bruno.
      42.desthuilli.. .@websiteburo.i nvalidwrote:
      Aaron "Castironpi " Brady a écrit :
      >
      >
      >
      Hello,
      >
      The 'inspect' module has this method:
      >
      inspect.getargv alues(frame)
      >
      It takes a frame and returns the parameters used to call it, including
      the locals as defined in the frame, as shown.
      >
      >>def f( a, b, d= None, *c, **e ):
      ...     import inspect
      ...     return inspect.getargv alues( inspect.current frame() )
      ...
      >>f( 0, 1, 'abc', 'def', ( 3, 2 ), h= 'ghi' )
      (['a', 'b', 'd'], 'c', 'e', {'a': 0, 'c': ('def', (3, 2)), 'b': 1,
      'e': {'h': 'g
      hi'}, 'd': 'abc', 'inspect': <module 'inspect' from 'C:\Programs
      \Python26\lib\i n
      spect.pyc'>})
      >
      However, if you wanted a decorator that examines the parameters to a
      function, you're out of luck.  By the time you have a frame, you're
      already in the function.
      >
      Hem...
      >
      def decorator(func) :
           def _decorator(*arg s, *kw):
               print "func args are ", *args, **kw
               return func(*args, **kw)
           return _decorator
      It is less of a problem without tuple unpacking, but you still have
      code like:

      if len( args )>= 2:
      b= args[ 1 ]
      else:
      try:
      b= (somehow check b's default val.)
      except NoDefaultVal:
      raise ArgumentError

      Worse yet, you have it for each parameter. Unless I missed something,
      this is the only way to mimic/recreate the signature of the decoratee.

      Comment

      • Bruno Desthuilliers

        #4
        Re: inspect feature

        Aaron "Castironpi " Brady a écrit :
        On Oct 9, 3:48 am, Bruno Desthuilliers <bruno.
        42.desthuilli.. .@websiteburo.i nvalidwrote:
        >Aaron "Castironpi " Brady a écrit :
        >>
        >>
        >>
        >>Hello,
        >>The 'inspect' module has this method:
        >>inspect.getar gvalues(frame)
        >>It takes a frame and returns the parameters used to call it, including
        >>the locals as defined in the frame, as shown.
        >>>>>def f( a, b, d= None, *c, **e ):
        >>... import inspect
        >>... return inspect.getargv alues( inspect.current frame() )
        >>...
        >>>>>f( 0, 1, 'abc', 'def', ( 3, 2 ), h= 'ghi' )
        >>(['a', 'b', 'd'], 'c', 'e', {'a': 0, 'c': ('def', (3, 2)), 'b': 1,
        >>'e': {'h': 'g
        >>hi'}, 'd': 'abc', 'inspect': <module 'inspect' from 'C:\Programs
        >>\Python26\lib \in
        >>spect.pyc'> })
        >>However, if you wanted a decorator that examines the parameters to a
        >>function, you're out of luck. By the time you have a frame, you're
        >>already in the function.
        >Hem...
        >>
        >def decorator(func) :
        > def _decorator(*arg s, *kw):
        > print "func args are ", *args, **kw
        > return func(*args, **kw)
        > return _decorator
        >
        It is less of a problem without tuple unpacking, but you still have
        code like:
        >
        if len( args )>= 2:
        b= args[ 1 ]
        else:
        try:
        b= (somehow check b's default val.)
        except NoDefaultVal:
        raise ArgumentError
        >
        Worse yet, you have it for each parameter. Unless I missed something,
        this is the only way to mimic/recreate the signature of the decoratee.
        I don't get what you're after ??? The decorator has full access to both
        the actual params *and* the function's signature (via
        inspect.getargs pec). So your initial question "if you wanted a decorator
        that examines the parameters to a function" seems fully answered. You
        will indeed have to write a couple lines of code if you want the same
        formating as the one you'd get with inspect.current frame(), but what ?

        FWIW, Michele Simionato's decorator module has some trick to allow for
        signature-preserving decorators, so you may want to have a look - but
        I'm not sure if this would solve your problem - at least in a sane way.

        Comment

        • Aaron \Castironpi\ Brady

          #5
          Re: inspect feature

          On Oct 10, 3:36 am, Bruno Desthuilliers <bruno.
          42.desthuilli.. .@websiteburo.i nvalidwrote:
          Aaron "Castironpi " Brady a écrit :
          >
          >
          >
          On Oct 9, 3:48 am, Bruno Desthuilliers <bruno.
          42.desthuilli.. .@websiteburo.i nvalidwrote:
          Aaron "Castironpi " Brady a écrit :
          >
          >Hello,
          >The 'inspect' module has this method:
          >inspect.getarg values(frame)
          >It takes a frame and returns the parameters used to call it, including
          >the locals as defined in the frame, as shown.
          >>>>def f( a, b, d= None, *c, **e ):
          >...     import inspect
          >...     return inspect.getargv alues( inspect.current frame() )
          >...
          >>>>f( 0, 1, 'abc', 'def', ( 3, 2 ), h= 'ghi' )
          >(['a', 'b', 'd'], 'c', 'e', {'a': 0, 'c': ('def', (3, 2)), 'b': 1,
          >'e': {'h': 'g
          >hi'}, 'd': 'abc', 'inspect': <module 'inspect' from 'C:\Programs
          >\Python26\lib\ in
          >spect.pyc'>} )
          >However, if you wanted a decorator that examines the parameters to a
          >function, you're out of luck.  By the time you have a frame, you're
          >already in the function.
          Hem...
          >
          def decorator(func) :
               def _decorator(*arg s, *kw):
                   print "func args are ", *args, **kw
                   return func(*args, **kw)
               return _decorator
          >
          It is less of a problem without tuple unpacking, but you still have
          code like:
          >
          if len( args )>= 2:
             b= args[ 1 ]
          else:
             try:
                b= (somehow check b's default val.)
             except NoDefaultVal:
                raise ArgumentError
          >
          Worse yet, you have it for each parameter.  Unless I missed something,
          this is the only way to mimic/recreate the signature of the decoratee.
          >
          I don't get what you're after ??? The decorator has full access to both
          the actual params *and* the function's signature (via
          inspect.getargs pec). So your initial question "if you wanted a decorator
          that examines the parameters to a function" seems fully answered. You
          will indeed have to write a couple lines of code if you want the same
          formating as the one you'd get with inspect.current frame(), but what ?
          >
          FWIW, Michele Simionato's decorator module has some trick to allow for
          signature-preserving decorators, so you may want to have a look - but
          I'm not sure if this would solve your problem - at least in a sane way.
          It's not exactly the next Millennium problem, but there are some
          substantial checks you have to do on a per-parameter basis to see the
          same thing that a function sees, when all you have is *args, **kwargs.

          You are wrapping a function with this signature:

          def f( a, b, c= None, *d, **e ):

          You want to find out the values of 'a', 'b', and 'c' in a decorator.
          You have these calls:

          f( 0, 1, 'abc', 'def', h= 'ghi' )
          f( 0, 1 )
          f( 0, 1, h= 'abc' )
          f( 0, 1, 'abc', c= 'def' ) #raise TypeError: multiple values

          How do you determine 'a', 'b', and 'c'?

          Comment

          • Gabriel Genellina

            #6
            Re: inspect feature

            En Fri, 10 Oct 2008 14:18:53 -0300, Aaron "Castironpi " Brady
            <castironpi@gma il.comescribió:
            On Oct 10, 3:36 am, Bruno Desthuilliers <bruno.
            42.desthuilli.. .@websiteburo.i nvalidwrote:
            >I don't get what you're after ??? The decorator has full access to both
            >the actual params *and* the function's signature (via
            >inspect.getarg spec). So your initial question "if you wanted a decorator
            >that examines the parameters to a function" seems fully answered. You
            >will indeed have to write a couple lines of code if you want the same
            >formating as the one you'd get with inspect.current frame(), but what ?
            >>
            >FWIW, Michele Simionato's decorator module has some trick to allow for
            >signature-preserving decorators, so you may want to have a look - but
            >I'm not sure if this would solve your problem - at least in a sane way.
            >
            It's not exactly the next Millennium problem, but there are some
            substantial checks you have to do on a per-parameter basis to see the
            same thing that a function sees, when all you have is *args, **kwargs.
            >
            You are wrapping a function with this signature:
            >
            def f( a, b, c= None, *d, **e ):
            >
            You want to find out the values of 'a', 'b', and 'c' in a decorator.
            You have these calls:
            >
            f( 0, 1, 'abc', 'def', h= 'ghi' )
            f( 0, 1 )
            f( 0, 1, h= 'abc' )
            f( 0, 1, 'abc', c= 'def' ) #raise TypeError: multiple values
            >
            How do you determine 'a', 'b', and 'c'?
            I'm afraid you'll have to duplicate the logic described here:
            This chapter explains the meaning of the elements of expressions in Python. Syntax Notes: In this and the following chapters, grammar notation will be used to describe syntax, not lexical analysis....

            To my knowledge, there is no available Python code (in the stdlib or
            something) that already does that.

            --
            Gabriel Genellina

            Comment

            • George Sakkis

              #7
              Re: inspect feature

              On Oct 14, 3:06 am, "Gabriel Genellina" <gagsl-...@yahoo.com.a r>
              wrote:
              En Fri, 10 Oct 2008 14:18:53 -0300, Aaron "Castironpi " Brady
              <castiro...@gma il.comescribió:
              >
              >
              >
              On Oct 10, 3:36 am, Bruno Desthuilliers <bruno.
              42.desthuilli.. .@websiteburo.i nvalidwrote:
              I don't get what you're after ??? The decorator has full access to both
              the actual params *and* the function's signature (via
              inspect.getargs pec). So your initial question "if you wanted a decorator
              that examines the parameters to a function" seems fully answered. You
              will indeed have to write a couple lines of code if you want the same
              formating as the one you'd get with inspect.current frame(), but what ?
              >
              FWIW, Michele Simionato's decorator module has some trick to allow for
              signature-preserving decorators, so you may want to have a look - but
              I'm not sure if this would solve your problem - at least in a sane way..
              >
              It's not exactly the next Millennium problem, but there are some
              substantial checks you have to do on a per-parameter basis to see the
              same thing that a function sees, when all you have is *args, **kwargs.
              >
              You are wrapping a function with this signature:
              >
              def f( a, b, c= None, *d, **e ):
              >
              You want to find out the values of 'a', 'b', and 'c' in a decorator.
              You have these calls:
              >
              f( 0, 1, 'abc', 'def', h= 'ghi' )
              f( 0, 1 )
              f( 0, 1, h= 'abc' )
              f( 0, 1, 'abc', c= 'def' ) #raise TypeError: multiple values
              >
              How do you determine 'a', 'b', and 'c'?
              >
              I'm afraid you'll have to duplicate the logic described here: http://docs.python.org/reference/expressions.html#id9
              To my knowledge, there is no available Python code (in the stdlib or
              something) that already does that.
              I wrote such a beast some time ago; it's hairy but to the best of my
              knowledge it seems to reproduce the standard Python logic:


              George

              Comment

              • Aaron \Castironpi\ Brady

                #8
                Re: inspect feature

                On Oct 14, 9:42 am, George Sakkis <george.sak...@ gmail.comwrote:
                On Oct 14, 3:06 am, "Gabriel Genellina" <gagsl-...@yahoo.com.a r>
                wrote:
                >
                >
                >
                En Fri, 10 Oct 2008 14:18:53 -0300, Aaron "Castironpi " Brady
                <castiro...@gma il.comescribió:
                >
                On Oct 10, 3:36 am, Bruno Desthuilliers <bruno.
                42.desthuilli.. .@websiteburo.i nvalidwrote:
                >I don't get what you're after ??? The decorator has full access to both
                >the actual params *and* the function's signature (via
                >inspect.getarg spec). So your initial question "if you wanted a decorator
                >that examines the parameters to a function" seems fully answered. You
                >will indeed have to write a couple lines of code if you want the same
                >formating as the one you'd get with inspect.current frame(), but what?
                >
                >FWIW, Michele Simionato's decorator module has some trick to allow for
                >signature-preserving decorators, so you may want to have a look - but
                >I'm not sure if this would solve your problem - at least in a sane way.
                >
                It's not exactly the next Millennium problem, but there are some
                substantial checks you have to do on a per-parameter basis to see the
                same thing that a function sees, when all you have is *args, **kwargs..
                >
                You are wrapping a function with this signature:
                >
                def f( a, b, c= None, *d, **e ):
                >
                You want to find out the values of 'a', 'b', and 'c' in a decorator.
                You have these calls:
                >
                f( 0, 1, 'abc', 'def', h= 'ghi' )
                f( 0, 1 )
                f( 0, 1, h= 'abc' )
                f( 0, 1, 'abc', c= 'def' ) #raise TypeError: multiple values
                >
                How do you determine 'a', 'b', and 'c'?
                >
                I'm afraid you'll have to duplicate the logic described here:  http://docs.python.org/reference/expressions.html#id9
                To my knowledge, there is no available Python code (in the stdlib or
                something) that already does that.
                >
                I wrote such a beast some time ago; it's hairy but to the best of my
                knowledge it seems to reproduce the standard Python logic:http://code.activestate.com/recipes/551779/
                >
                George
                I didn't see a 'got a duplicate argument for keyword "d"' error, but I
                can add one if I need to.

                Is there some reason why the built-in behavior should not be made
                available, such as it's poorly defined outside the function? Or is it
                just the fact that it's complicated that keeps it out of 'inspect'?

                Comment

                • George Sakkis

                  #9
                  Re: inspect feature

                  On Oct 14, 2:35 pm, "Aaron \"Castironpi \" Brady"
                  <castiro...@gma il.comwrote:
                  On Oct 14, 9:42 am, George Sakkis <george.sak...@ gmail.comwrote:
                  >
                  >
                  >
                  On Oct 14, 3:06 am, "Gabriel Genellina" <gagsl-...@yahoo.com.a r>
                  wrote:
                  >
                  En Fri, 10 Oct 2008 14:18:53 -0300, Aaron "Castironpi " Brady
                  <castiro...@gma il.comescribió:
                  >
                  On Oct 10, 3:36 am, Bruno Desthuilliers <bruno.
                  42.desthuilli.. .@websiteburo.i nvalidwrote:
                  I don't get what you're after ??? The decorator has full access toboth
                  the actual params *and* the function's signature (via
                  inspect.getargs pec). So your initial question "if you wanted a decorator
                  that examines the parameters to a function" seems fully answered. You
                  will indeed have to write a couple lines of code if you want the same
                  formating as the one you'd get with inspect.current frame(), but what ?
                  >
                  FWIW, Michele Simionato's decorator module has some trick to allowfor
                  signature-preserving decorators, so you may want to have a look - but
                  I'm not sure if this would solve your problem - at least in a saneway.
                  >
                  It's not exactly the next Millennium problem, but there are some
                  substantial checks you have to do on a per-parameter basis to see the
                  same thing that a function sees, when all you have is *args, **kwargs.
                  >
                  You are wrapping a function with this signature:
                  >
                  def f( a, b, c= None, *d, **e ):
                  >
                  You want to find out the values of 'a', 'b', and 'c' in a decorator..
                  You have these calls:
                  >
                  f( 0, 1, 'abc', 'def', h= 'ghi' )
                  f( 0, 1 )
                  f( 0, 1, h= 'abc' )
                  f( 0, 1, 'abc', c= 'def' ) #raise TypeError: multiple values
                  >
                  How do you determine 'a', 'b', and 'c'?
                  >
                  I'm afraid you'll have to duplicate the logic described here: http://docs.python.org/reference/expressions.html#id9
                  To my knowledge, there is no available Python code (in the stdlib or
                  something) that already does that.
                  >
                  I wrote such a beast some time ago; it's hairy but to the best of my
                  knowledge it seems to reproduce the standard Python logic:http://code.activestate.com/recipes/551779/
                  >
                  George
                  >
                  I didn't see a 'got a duplicate argument for keyword "d"' error, but I
                  can add one if I need to.
                  Why don't you try it out:
                  >>def f( a, b, c= None, *d, **e ): pass
                  >>getcallargs(f , 0, 1, 'abc', c= 'def' )
                  Traceback (most recent call last):
                  File "<stdin>", line 1, in <module>
                  File "getcallargs.py ", line 53, in getcallargs
                  "argument '%s'" % (f_name,arg))
                  TypeError: f() got multiple values for keyword argument 'c'

                  George

                  Comment

                  Working...