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