I'm a python beginner, and I just learned a technique involving dictionaries and functions. The syntax is easy and it seems like a trivial thing, but my python senses are tingling. Something tells me this is a deep and very pythonic concept and I'm not quite grasping its importance. Can someone put a name to this technique and explain how/why it's useful?The technique is when you have a python dictionary and a function that you intend to use on it.  You insert an extra element into the dict, whose value is the name of the function. When you're ready to call the function you issue the call indirectly by referring to the dict element, not the function by name.The example I'm working from is from Learn Python the Hard Way, 2nd Ed. (This is the version available when you sign up through Udemy.com; sadly the live free HTML version is currently Ed 3, and no longer includes this example). To paraphrase:# make a dictionary of US states and major citiescities = {'San Diego':'CA', 'New York':'NY', 'Detroit':'MI'}# define a function to use on such a dictionarydef find_city (map, city):    # does something, returns some value    if city in map:        return map[city]    else:        return Not found# then add a final dict element that refers to the functioncities['_found'] = find_cityThen the following expressions are equivalent. You can call the function directly, or by referencing the dict element whose value is the function.>>> find_city (cities, 'New York')NY>>> cities['_found'](cities, 'New York')NYCan someone explain what language feature this is, and maybe where it comes to play in real programming? This toy exercise was enough to teach me the syntax, but didn't take me all the way there.
Why store a function inside a python dictionary?
python;syntax;functions;dictionary
Using a dict let's you translate the key into a callable. The key doesn't need to be hardcoded though, as in your example.Usually, this is a form of caller dispatch, where you use the value of a variable to connect to a function. Say a network process sends you command codes, a dispatch mapping lets you translate the command codes easily into executable code:def do_ping(self, arg):    return 'Pong, {0}!'.format(arg)def do_ls(self, arg):    return '\n'.join(os.listdir(arg))dispatch = {    'ping': do_ping,    'ls': do_ls,}def process_network_command(command, arg):    send(dispatch[command](arg))Note that what function we call now depends entirely on what the value is of command. The key doesn't have to match either; it doesn't even have to be a string, you could use anything that can be used as a key, and fits your specific application.Using a dispatch method is safer than other techniques, such as eval(), as it limits the commands allowable to what you defined beforehand. No attacker is going to sneak a ls); DROP TABLE Students; -- injection past a dispatch table, for example.