Cascading ifs

Discussion in 'Python' started by =?ISO-8859-1?Q?Ernesto_Garc=EDa_Garc=EDa?=, Apr 2, 2007.

  1. 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-1?Q?Ernesto_Garc=EDa_Garc=EDa?=, Apr 2, 2007
    #1
    1. Advertisements

  2. 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.
     
    =?ISO-8859-2?Q?Wojciech_Mu=B3a?=, Apr 2, 2007
    #2
    1. Advertisements

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

    Duncan Booth Guest

    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).
     
    Duncan Booth, Apr 2, 2007
    #3
  4. =?ISO-8859-1?Q?Ernesto_Garc=EDa_Garc=EDa?=

    irstas Guest


    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.
     
    irstas, Apr 2, 2007
    #4
  5. tbl = [(my_regex, doSomething), (my_regex2, doSomething2), (my_regex3,
    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
     
    =?ISO-8859-2?Q?Ernesto_Garc=EDa_Garc=EDa?=, Apr 9, 2007
    #5
    1. Advertisements

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 (here). After that, you can post your question and our members will help you out.