Short circuting

Tim Chase python.list at tim.thechases.com
Fri Jan 21 21:59:43 EST 2011


On 01/21/2011 05:33 PM, Ed Connell wrote:
> Consider the following please:  (re_section, re_name, etc are previously
> compiled patterns)
>
>                         result1 = re_section.search(line);
>                         result2 = re_name.search(line);
>                         result3 = re_data1.search(line);
>                         result4 = re_data2.search(line);
>
>                         if result1:
>                                 last_section = result1.group()[18:-5]
>                         elif result2:
>                                 last_name = result2.group(0)[6:-1]
>                         elif result3:
>                                 data[last_section] = {last_name:
> result3.group()[13:-5]}
>                         elif result4:
>                                 data[last_section] = {last_name:
> result4.group()[17:-5]}
>
> It gets my goat to have to obtain all resultx when I just want the first
> that is not None.  (In theory, the number of results can be much longer.)

The problem isn't so much the elif structure, but that you're 
doing different things with each result.  If they were attributes 
of a class and value assignments (instead of top-level variables, 
sometimes calling .group() with no params & sometimes with "0", 
and a mix of strings/dicts), you could do something like

   line = "..."
   info = object() # some class with attributes to update
   for name, r, slc in (
       ("section", re_section, slice(18,-5)),
       ("name", re_name, slice(6,-1)),
       ("data1", re_data1, slice(13,-5)),
       ("data2", re_data2, slice(17,-5)),
       ):
     result = r.search(line)
     if result:
       setattr(info, name, result.group(0)[slc])
       break
   else:
     woah_none_matched(fail, fail, fail, do_I_care)

So if you're doing predictable things with each, it's not too bad.

-tkc






More information about the Python-list mailing list