5 ms·
This is a common practice in Python and most of the implementations I have seen (and used) use it in a following way: handler = { 'football': handl
by amix 17y ago
This is a common practice in Python and most of the implementations I have seen (and used) use it in a following way:
handler = {
'football': handle_football,
'comedy': handle_comedy,
'crime': hendle_crime
}.get
handler('crime')(...)
- domnit 17y agoAs a dynamic language, Python already has similar tables built in. You can use something like: getattr(self, 'handle_%s' % action)
- kyleburton 17y agoIf action comes from outside the program, this can open up unexpected behavior. The dispatch table is closed - there's less chance that user input will invoke something unintended.
- domnit 17y agoIn a real world program you would validate input and make sure you get something callable (with either technique). The only additional unexpected behavior is when there could be unexpected handle_xxx attributes. If we take for granted that the programmer defines the dict for the explicit dispatch table, though, we can also assume that the programmer defines the object for the implicit table.
- eru 17y agoI feel the version from the original comment is most Pythonic. The other version is close to an eval-function, which seems to be frowned up on in Python.
- cma 17y agoThe second version is slower too. Here's what I use for e.g. a state machine, which follows "don't repeat yourself" a little better than the first example: # {state_name: state_action} states = {} state = ['start'] def reg(func): states[func.__name__] = func return func # define and simultaneously register the states @reg def start(): state[0] = 'second' @reg def second(): state[0] = 'last' @reg def last(): state[0] = None # run the state machine while state[0]: print state[0] states[state[0]]()
- kyleburton 17y agoIMO as code gets modified by other developers, the table is easier to keep 'safe' since it is clearer that is what it's for, the sprintf and all the other methods don't tend to be in one place - as methods get added, the reflection issue is oft overlooked.
- blasdel 17y agoIt's especially common since Python purposefully doesn't have a fake switch/case statement -- if it can't be turned into a jumptable at compile-time, it ain't real! The inane lisper bon mot is stated backwards: it should be "Data isn't code"
- pushingbits 17y agoI use this all the time in C++. std::map<std::string, boost::function<void (int)>> handlerMap; boost::assign::insert(handlerMap) ("football", &handleFootball) ("comedy", &handleComedy) ("crime", &handleCrime); handlerMap["football"](channelNumber); Makes the code so much easier to understand. And when the handler functions start getting too complex, you can just add another level: handlerMap["comedy"]["situational_comedy"](channelNumber);