Cascading ifs

  • Thread starter =?ISO-8859-1?Q?Ernesto_Garc=EDa_Garc=EDa?=
  • Start date
?

=?ISO-8859-1?Q?Ernesto_Garc=EDa_Garc=EDa?=

Hi experts,

How would you do this without the more and more indenting cascade of ifs?:

match = my_regex.search(line)
if match:
doSomething(line)
else:
match = my_regex2.search(line)
if match:
doSomething2(line)
else:
match = my_regex3.search(line)
if match:
doSomething3(line)

etc.

Thanks in advance and regards,
Ernesto
 
?

=?ISO-8859-2?Q?Wojciech_Mu=B3a?=

Ernesto said:
Hi experts,

How would you do this without the more and more indenting cascade of ifs?:

match = my_regex.search(line)
if match:
doSomething(line)
else:
match = my_regex2.search(line)
if match:
doSomething2(line)
else:
match = my_regex3.search(line)
if match:
doSomething3(line)

etc.

tbl = [(my_regex, doSomething), (my_regex2, doSomething2), (my_regex3,
doSomething3)]
for regex, fun in tbl:
match = regexp.match(line)
if match:
fun(line)
break

w.
 
D

Duncan Booth

Ernesto García García said:
Hi experts,

How would you do this without the more and more indenting cascade of
ifs?:

match = my_regex.search(line)
if match:
doSomething(line)
else:
match = my_regex2.search(line)
if match:
doSomething2(line)
else:
match = my_regex3.search(line)
if match:
doSomething3(line)

etc.

Thanks in advance and regards,
Ernesto

PATTERNS = [
(my_regex, doSomething),
(my_regex2, doSomething2),
(my_regex3, doSomething3),
]
....

for regex, action in PATTERNS:
match = regex.search(line)
if match:
action(line)
break


Also be aware that repeatedly calling the search method with different
regular expressions is horribly inefficient. You would be much better to
combine the regular expressions into one and check which groups match
(although admittedly that behaves differently since it would find the
regex which matches earliest in the string instead of finding the first
regex which matches anywhere).
 
I

irstas

Hi experts,

How would you do this without the more and more indenting cascade of ifs?:

match = my_regex.search(line)
if match:
   doSomething(line)
else:
   match = my_regex2.search(line)
   if match:
     doSomething2(line)
   else:
     match = my_regex3.search(line)
     if match:
       doSomething3(line)

etc.

Thanks in advance and regards,
Ernesto


You might be able to use "guard clauses":
http://www.refactoring.com/catalog/replaceNestedConditionalWithGuardClauses..html


match = my_regex.search(line)
if match:
   doSomething(line)
return

match = my_regex2.search(line)
if match:
   doSomething2(line)
return


But if all of the blocks contain the same code like they do in your
example, you're better off using the solutions provided by Wojciech
Muła and Duncan Booth, because they abstract away the repetition.
 
?

=?ISO-8859-2?Q?Ernesto_Garc=EDa_Garc=EDa?=

tbl = [(my_regex, doSomething), (my_regex2, doSomething2), (my_regex3,
doSomething3)]
for regex, fun in tbl:
match = regexp.match(line)
if match:
fun(line)
break

Thank you for the idea. This is a bit more difficult when functions need
to work with a common context, but in that case I could store the
context in an object and use the object's methods.

Thanks,
Ernesto
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Staff online

Members online

Forum statistics

Threads
473,769
Messages
2,569,577
Members
45,054
Latest member
LucyCarper

Latest Threads

Top