[Tutor] Dynamic Function Calls

Dave Angel davea at ieee.org
Fri Aug 14 21:53:30 CEST 2009


Megan Land wrote:
>                                                                                                    
>   From:       Dave Angel <davea at ieee.org>                                                          
>                                                                                                    
>   To:         bob gailer <bgailer at gmail.com>                                                       
>                                                                                                    
>   Cc:         Megan Land/Raleigh/Contr/IBM at IBMUS, tutor at python.org                                 
>                                                                                                    
>   Date:       08/14/2009 01:53 PM                                                                  
>                                                                                                    
>   Subject:    Re: Re: [Tutor] Dynamic Function Calls                                               
>                                                                                                    
>
>
>
>
>
>
>
>
> bob gailer wrote:
>   
>> <div class="moz-text-flowed" style="font-family: -moz-fixed">Megan
>> Land wrote:
>>     
>>> All three methods are defined below the snippet I provided.
>>>
>>>       
>> In Python names must be defined before they are referenced. Put these
>> defs above the snippet.
>>
>>     
>>> def func():
>>> code...
>>> def func0():
>>> do stuff
>>> def func1():
>>> do stuff
>>> def func2():
>>> do stuff
>>>
>>> Megan Land
>>> FVT Blade EMET Test Engineer
>>> mland at us.ibm.com
>>>
>>> Inactive hide details for Kent Johnson ---08/13/2009 05:18:10 PM---On
>>> Thu, Aug 13, 2009 at 3:30 PM, Megan Land<mland at us.ibm.comKent Johnson
>>> ---08/13/2009 05:18:10 PM---On Thu, Aug 13, 2009 at 3:30 PM, Megan
>>> Land<mland at us.ibm.com> wrote: > Hi,
>>>
>>>
>>> From:
>>> Kent Johnson <kent37 at tds.net>
>>>
>>> To:
>>> Megan Land/Raleigh/Contr/IBM at IBMUS
>>>
>>> Cc:
>>> tutor at python.org
>>>
>>> Date:
>>> 08/13/2009 05:18 PM
>>>
>>> Subject:
>>> Re: [Tutor] Dynamic Function Calls
>>>
>>> Sent by:
>>> kent3737 at gmail.com
>>>
>>> ------------------------------------------------------------------------
>>>
>>>
>>>
>>> On Thu, Aug 13, 2009 at 3:30 PM, Megan Land<mland at us.ibm.com> wrote:
>>>       
>>>> Hi,
>>>>
>>>> I'm trying to call a function from a dictionary. I did some
>>>>         
>>> googling and
>>>       
>>>> from what I can tell my code should work, but doesn't. Here's an
>>>>         
>>> example:
>>>       
>>>> def myFunc(self, inputList):
>>>> dict={0: func0, 1: func1, 2:func2}
>>>> for element in inputList:
>>>> dict[element]()
>>>>
>>>> When I go to run this I get an error saying func0 is not defined. Does
>>>> anyone have any ideas as to why this won't work? I'm using Python
>>>>         
>>> 2.6 if
>>>       
>>>> that makes any difference.
>>>>         
>>> You don't show any definition for func0 in the above snippet. Where is
>>> it defined?
>>>
>>> Kent
>>>
>>> ------------------------------------------------------------------------
>>>
>>> _______________________________________________
>>> Tutor maillist  -  Tutor at python.org
>>> http://mail.python.org/mailman/listinfo/tutor
>>>
>>>       
> You can put these defs in any order.  But when you invoke the function
> from your outerlevel code, all of them need to have been defined.  I'm
> guessing you had these in this order:
>
> <code>
> def myFunc(self, inputList):
>     dictionary={0: func0, 1: func1, 2:func2}
>     for element in inputList:
>         dictionary[element]()    ...
>
> myFunc(3, 1, 2, 1)                 #this is too early in the file,
> because the following defs have not been defined yet
>
> def func():
>      code...
> def func0():
>     do stuff
> def func1():
>     do stuff
> def func2():
>     do stuff
>
> #move the call to myFunc() here
> </code>
>
>
> Move the outerlevel code to the end, and you're usually better off.  You
> also might want to put it inside an
> if __name__ == "__main__":
>
> clause.
>
>
> Note, I also changed the variable 'dict'  to 'dictionary,'  since dict
> already has a meaning in Python.  Not a big deal in this particular
> case, but if you ever wanted to convert a list to a dict, and called
> dict(), you'd wonder what went wrong.  Better to kill the habit early.
>
> DaveA
>
>
> I have the method inside a main method at the end of my program.  The weird
> thing is that I typed up my small example and ran it and it worked fine.
> But when I run my big program, I still get the error that func0, as I call
> it in my example, is not defined.  Do you  think there could be something
> else in my program that is making this go wrong?
>
>
> Megan Land
> FVT Blade EMET Test Engineer
> mland at us.ibm.com
>   
Something's wrong with your email program's quoting logic.  So your last 
response looks like it's part of my last email.

:::  Do you think there could be something else....

Yes, certainly.  Question is what.   You use the word method a couple of 
times above, yet none of your code shows classes.  Was that a typo?

First thing is you should stop paraphrasing and describing, and include 
actual code, actual full error messages, and so on.  If you had actually 
run a small sample, you would have found out then that it worked, and 
that your description doesn't match the problem you're having with the 
full code.  Once you have a real code example that fails, use copy/paste 
so we see it exactly as it is.

Next, you should realize that an error like :

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'xyzzy' is not defined

means that the symbol 'xyzzy' cannot be located in the valid namespaces 
of the current context.  So we need to see the context.  If it's a 
function, there is a local namespace and a global one.  Despite the 
word, it's only global to this particular module.   If it's a class 
method, or a nested function, the rules are different.  And the whole 
problem has nothing to do with dynamic function calls, as the happens 
before you ever get to the call.

In front of that "dictionary=" line, insert a real call to func0(), and 
see if it gives a similar error.   Then try a call to     print 
help(__name__).  That should display all the global symbols for your module.

If func0() doesn't work in MyFunc(), then see if it works in the 
function that calls it.  And see if it works in your outer-level code, 
just before you call main().

DaveA



More information about the Tutor mailing list