samedi 3 septembre 2016

Programmatically generate if elif elif elif else

I would like to condense some wet code that looks like this:

if slips[i] < 3000:
    ac.setBackgroundColor(wheel['slip'], 0, 0, 0)
elif slips[i] < 3700:
    ac.setBackgroundColor(wheel['slip'], .2, .4, .2)
    ac.setBackgroundOpacity(wheel['slip'], 1)
elif slips[i] < 4100:
    ac.setBackgroundColor(wheel['slip'], 0, 1, 0)
    ac.setBackgroundOpacity(wheel['slip'], 1)
elif slips[i] < 4500:
    ac.setBackgroundColor(wheel['slip'], 0, 0, 1)
    ac.setBackgroundOpacity(wheel['slip'], 1)
else:
    ac.setBackgroundColor(wheel['slip'], 1, 0, 0)
    ac.setBackgroundOpacity(wheel['slip'], 1)

Each time this snippet of code is repeated, the only things that change are the background canvas (wheel['slip'] in this case), and the numbers in the if elif else's.

My first thought to dry this up was to make something that could be used like this:

if_replacer(wheel['slip'], slips[i], 3000, 3700, 4100, 4500)

def if_replacer(canvas, value, *args):
    # idunno

My question is, how would I programmatically generate the if elif else's? I know I could hard-code it like so:

def if_replacer(canvas, value, c1, c2, c3, c4):
    if value < c1:
        ac.setBackgroundColor(canvas, 0, 0, 0)
        return
    elif value < c2:
        ac.setBackgroundColor(canvas, .2, .4, .2)
    elif value < c3:
        ac.setBackgroundColor(canvas, 0, 1, 0)
    elif value < c4:
        ac.setBackgroundColor(canvas, 0, 0, 1)
    else:
        ac.setBackgroundColor(canvas, 1, 0, 0)
    ac.setBackgroundOpacity(canvas, 1)

But I'm interested if there is a succinct and Pythonic method to accomplish this.

Aucun commentaire:

Enregistrer un commentaire