Steven, Alan, Knacktus, thanks for your help. I was indeed very confused because I thought '_find' was calling something special instead of just being added to the dictionary (the confusion stemming from http://www.python.org/dev/peps/pep-0004/ where find module is obsolete).
When I ran the code, the error I got was: max:python max$ python ex40.py State? (ENTER to quit) > CA Traceback (most recent call last): File "ex40.py", line 22, in <module> city_found = cities['_find'](cities, state) File "ex40.py", line 8, in find_city return themap(state) TypeError: 'dict' object is not callable Two main mistakes: (1) not including the actual search in the while loop and (2) wrong parentheses in return themap(state) instead of return themap[state]. Fixed version which runs: cities = {'CA': 'San Francisco', 'MI': 'Detroit', 'FL': 'Jacksonville'} def find_city(themap, state): if state in themap: return themap[state] else: return "Not found." cities['_find'] = find_city while True: print "State? (ENTER to quit)", state = raw_input ("> ") if not state: break city_found = cities['_find'](cities, state) print city_found Thanks for your help, especially the comments about keeping things separate and explicit. Now to find out why Zed Shaw thinks this is a good way of doing it... Best, Max On Sun, Feb 20, 2011 at 9:40 AM, Knacktus <knack...@googlemail.com> wrote: > Am 20.02.2011 05:14, schrieb Max Niederhofer: > >> Hello all, > > Hello Max, >> >> first post, please be gentle. I'm having serious trouble finding an >> alternative for the deprecated find module for dictionaries. >> >> The code (from Zed Shaw's Hard Way, exercise 40) goes something like >> this. Hope indentation survives. >> >> cities = {'CA': 'San Francisco', 'MI': 'Detroit', 'FL': 'Jacksonville'} > > I use a naming convention for dicts that has made me very happy on several > occasion ;-): > key_to_value, in your case > state_to_city = {...} >> >> def find_city(themap, state): >> if state in themap: >> return themap[state] >> else: >> return "Not found." >> >> cities['_find'] = find_city > > Did you put this entry into the same dictionary as the data on purpose? > Or is the purpose a kind of dispatch? Something that could be a dict on its > own, like > private_function_name_to_function = {'_find': find_city} > You should try to keep things seperate and explicit. >> >> while True: >> print "State? (ENTER to quit)", >> state = raw_input("> ") >> >> if not state: break >> >> city_found = cities['_find'](cities, state) >> print city_found >> >> My question is - how do I rewrite this using an alternate module given >> find is deprecated? Grateful for all suggestions or pointers. For >> reference, I'm using 2.6.1 on darwin. >> >> Thanks so much for your help. >> >> Best, >> Max >> >> -- >> Dr. Maximilian Niederhofer >> Founder, Qwerly >> http://qwerly.com/ | http://qwerly.com/max >> +44 78 3783 8227 >> _______________________________________________ >> Tutor maillist - Tutor@python.org >> To unsubscribe or change subscription options: >> http://mail.python.org/mailman/listinfo/tutor > > _______________________________________________ > Tutor maillist - Tutor@python.org > To unsubscribe or change subscription options: > http://mail.python.org/mailman/listinfo/tutor > -- Dr. Maximilian Niederhofer Founder, Qwerly http://qwerly.com/ | http://qwerly.com/max +44 78 3783 8227 _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor