On Jul 13, 7:00 pm, Terry Reedy <[EMAIL PROTECTED]> wrote: > Tim Cook wrote: > > I guess I can classify my application(s) as more procedural than > > anything else. But I have a question about the best way to handle > > something in Python. > > > When given a mapping of keywords, I want to call a function based on a > > certain keyword found when parsing a text file. The mapping looks like > > this: > > > definClassMap={'SECTION':'bldSection','COMPOSITION':'bldComposition','OBSER > > VATION':'bldObservation','ITEM_TREE':'bldItemTree'} > > > So if the text file contains 'ITEM_TREE' I want to call bldItemTree > > which creates an instance of the class ItemTree. > > > I currently use an if ..., elif ... construct. > > Is there a better, more efficient, more Pythonic way of doing this? > > Yes. Create a mapping of keywords to function objects rather than to > function names! > > def bldSection(): <whatever> > ... > def bldItemTree(): <whatever else> > > class_map={ > 'SECTION':bldSection, > 'COMPOSITION':bldComposition, > 'OBSERVATION':bldObservation, > 'ITEM_TREE':bldItemTree, # trailing comma allows easy additions > > } > > for word in parselist: > try; > class_map[word]() > except KeyError: > <whatever for non-keys>
A nice variant of this, which minimizes repetition, is to group all the factory methods together into a class, naming them the same as the keyword... class Builder(object): def SECTION(self): ... def COMPOSITION(self): ... def OBSERVATION(self): ... def ITEM_TREE(self): ... builder = Builder() for word in parse_list: item = getattr(builder, word)() ... -- Paul Hankin -- http://mail.python.org/mailman/listinfo/python-list