Usando um dict, você pode traduzir a chave em um callable. A chave não precisa ser codificada, como no seu exemplo.
Normalmente, esta é uma forma de envio de chamadas, onde você usa o valor de uma variável para se conectar a uma função. Digamos que um processo de rede lhe envie códigos de comando, um mapeamento de despacho permite traduzir os códigos de comando facilmente em código executável:
def do_ping(self, arg):
return 'Pong, {0}!'.format(arg)
def do_ls(self, arg):
return '\n'.join(os.listdir(arg))
dispatch = {
'ping': do_ping,
'ls': do_ls,
}
def process_network_command(command, arg):
send(dispatch[command](arg))
Note que a função que chamamos agora depende inteiramente do valor de command
. A chave também não precisa corresponder; nem precisa ser uma string, você pode usar qualquer coisa que possa ser usada como chave e se adequar à sua aplicação específica.
O uso de um método de despacho é mais seguro do que outras técnicas, como eval()
, pois limita os comandos permitidos ao que você definiu anteriormente. Nenhum invasor vai esgueirar uma injeção de ls)"; DROP TABLE Students; --
após uma tabela de despacho, por exemplo.