[Tutor] Accessing the name of a Function

Carroll, Barry Barry.Carroll at psc.com
Wed Dec 13 23:44:41 CET 2006


Greetings:

Andreas and Kent helped me solve my problem.  We are writing a keyword
driven framework for embedded SW testing.  The framework supports scores
of keywords, built-in and user-defined.  We are still writing the
framework, so none of the functions for manipulating the target device
has been written, although the keywords are defined.  As a result, he
framework's output log is full of "keyword not found" errors, which mask
real errors in framework operation.  

To get rid of these 'pseudo errors' I wanted a stub handler that would
output an information message, with the name of the function and its
arguments.  Using the sys._getframe method and the inspect.getargvalues
methods, I was able to write a single routine that will handle any
function signature.  Here is the result:

A sample keyword triggered function:
##########
import sys
from actioncommon import handlestub

def doaction_dbopen(ctrl, proc, schemafile, configfile,
dataset="default"):
    '''A, Config, DB, Open, schemafile, configfile, dataset="default"
    
    Open the testbench data base. 
    Where:
        schemafile (str) - the xml schema file for the product to be
tested; 
        configfile (str) - the configuration file for the product to be 
                           tested; 
        dataset    (str) - optional configuration data set to activate.

                           defaults to "default"
    Example:
        A, Config, DB, Open, "master.xml", "test.tex", "current"
    '''
    # TODO: replace stub handler with action logic.
    handlestub(ctrl, proc, sys._getframe())
    return True
##########

The stub handler:
##########
from inspect import getargvalues

def handlestub(ctrl, proc, thestubframe):
    """Identifies actions that are defined but not yet implemented."""
    
    themsg = "Execuiting %s (implementation pending) with arguments: " %
\
             thestubframe.f_code.co_name
    (theargnames, trash1, trash2,
thelocalsdict)=getargvalues(thestubframe)
    # The first two arguments are internal to the application: do not 
      display.
    if len(theargnames) <= 2:
        themsg += "None"
    else:
        for theargname in theargnames[2:]:
            themsg += "%s=%s  " % (theargname,
thelocalsdict[theargname])    ctrl.log.logaction(ctrl.log.INFO, themsg)
##########

The resulting log output:
##########
INFO     Execuiting doaction_dbopen (implementation pending) with
arguments: schemafile=USBIBM.XML  configfile=USBIBM.TEX
dataset=usbimbstart
##########

Thanks to Andreas and Kent for their help
 
Regards,
 
Barry
barry.carroll at psc.com
541-302-1107
________________________
We who cut mere stones must always be envisioning cathedrals.

-Quarry worker's creed


> -----Original Message-----
> From: Kent Johnson [mailto:kent37 at tds.net]
> Sent: Wednesday, December 13, 2006 2:55 AM
> To: Carroll, Barry
> Cc: tutor at python.org
> Subject: Re: [Tutor] Accessing the name of a Function
> 
> Carroll, Barry wrote:
> > Andreas:
> >
> > You're right, that is kind of messy and somewhat limited.  In the
> > present case, however, it is the function's defined name that I
want, so
> > this would work okay.
> >
> > I'm guessing that there is a way to determine the number and names
of
> > the arguments to the function as well.  I'll go look at the sys
module
> > and see what I can find.
> 
> Look at the inspect module, specifically getargspec() and
getargvalues().
> 
> Kent
> 



More information about the Tutor mailing list