Switch-case com dicionários


Algumas linguagens como Java e Javascript tem suporte a switch-cases, uma maneira de amarrar condicionais a um valor, como em uma cascata de opções.

switch(x) {
  case "value1":  // if (x === "value1")
    ...
    break;
  case "value2":  // if (x === "value2")
    ...
    break;
  default:
    ...
    break;
}

Em Python não temos switch-cases mas, frequentemente, utilizamos if/elif/elses para obter o mesmo resultado. Aqui um exemplo dessa estrutura em um caso onde determinadas funções devem ser chamadas a depender do valor:

def to_expense(item):
    new_item = {}
    for key, value in item.items():
        field = citycouncil_expenses[key]
        value = value.strip()
        if field == "value":
            value = currency_to_float(value)
        elif field == "excluded":
            value = to_boolean(value)
        elif field in ("published_at", "date"):
            value = from_str_to_date(value)
        elif field == "phase":
            value = get_phase(value)
        new_item[field] = value
    return new_item

Uma outra maneira de fazer isso é utilizando dicionários:

def to_expense(item):
    functions = {
        value": currency_to_float,  # métodos a serem executados
        "excluded": to_boolean,
        "published_at": from_str_to_date,
        "date": from_str_to_date,
        "phase": get_phase,
    }
    new_item = {}
    for key, value in item.items():
        field = citycouncil_expenses[key]
        value = value.strip()
        new_item[field] = functions.get(field, lambda x: x)(value)
    return new_item

No dicionário functions temos os métodos que precisam ser executados para determinados campos. A linha functions.get(field, lambda x: x)(value) busca pelo método; caso não seja encontrado, retornamos uma lambda que simplesmente retorna o mesmo valor.

A ideia é que o código não tenha uma sequência extensa de if/elses e que fique claro o mapeamento entre os campos e os métodos.

Essa foi uma dica bem curtinha. Até a próxima!


comments powered by Disqus