Randy Belt wrote:
Hi,

I have a small test program written trying to set up a dictionary that
points keys to functions.  It is working.  However, in the process of
creating it I noticed a weird problem.  The problem is that this IS WORKING
and I think it shouldn't be.

~ Here is the input config file code ~  its called config.file and is
referenced from the script.

[MAPS]
relmap = 1
posmap = 1
asnmap = 1

~ Here is the code that is working but I feel that it shouldn't be ~

import ConfigParser
config = ConfigParser.ConfigParser()
config.read("config.file")
sections = config.sections()
print config.options('MAPS')
def posmap():
    print "posmap function"
def relmap():
    print "relmap function"
def asnmap():
    print "asnmap function"
for value in config.options('MAPS'):
    value
map_library = {
               'posmap': posmap()
              ,'relmap': relmap()
              ,'asnmap': asnmap()
              }

~ Output ~

['posmap', 'relmap', 'asnmap']
posmap function
relmap function
asnmap function

~ The reason I'm confused is because when I change the code (Take away the
map_library dictionary)

import ConfigParser
config = ConfigParser.ConfigParser()
config.read("config.file")
sections = config.sections()
print config.options('MAPS')
def posmap():
    print "posmap function"
def relmap():
    print "relmap function"
def asnmap():
    print "asnmap function"
for value in config.options('MAPS'):
    value

~ The output is the following ~

['posmap', 'relmap', 'asnmap']

Is this defaulting to the dictionary and making it work?  In the first set
of code I don't reference the map at all but it still seems to know where to
look?  I am considerably new to Python

I don't blame you for being confused. You're doing two things wrong which has the side effect of making it seem to be working. The reason it isn't obvious is that you happen to use the same ordering in your config.file as you use initializing map_library.

Your initialization code for map_library is incorrect. You're actually calling each of those three functions during that line, and they each do their printing. However, this has nothing to do with the entries in config.options. If you want to be really surprised, try printing map_libary. It should have values of None for each of the three keys.


I suggest you move the three defs and the map_library initialization near the beginning of your script (just after the imports). Precede it with an import sys, and follow it with a sys.exit(0), and run just that portion. You'll see that it prints out the three lines already. What you actually want is not to execute each function, but to create each function object. So change the line as follows:

map_library = {
              'posmap': posmap
             ,'relmap': relmap
             ,'asnmap': asnmap
             }

Note that I don't use parentheses, so the functions are not executing yet.

Now (when you remove the sys.exit()), let's look at your for-loop. For each item in the list, you do exactly nothing. That's probably where you want to be calling the elements of map_library. And since we moved its initialization earlier, we can actually do that, as I'm sure you were about to do.

DaveA

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to