Functional/Best?

Paul Hankin paul.hankin at gmail.com
Mon Jul 14 00:29:56 CEST 2008


On Jul 13, 7:00 pm, Terry Reedy <tjre... at udel.edu> 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



More information about the Python-list mailing list