Por que usar dois underlines como nome de variável?

Publicado em 2009-03-12 por Vinicius Assef

É comum criarmos variáveis que não vamos usar para nada, mas elas precisam existir em alguns casos. Um deles é para receber o retorno de uma função. Existe uma forma de deixar isso claro em Python.

Um dummy object é uma convenção que deixa claro que um valor nunca será usado. Em outras palavras, é uma variável que será descartada, uma throwaway variable.

Certamente você já se deparou com uma situação assim:

def get_dados(id_):
    # Acessa os dados no BD
    return (funcionario.nome, funcionario.data_admissao, cargo.descricao)

# ...

dados = get_dados(algum_id)
nome = dados[0] # nao precisa de nenhum outro campo

Há alguns problemas com essa forma de receber o retorno de get_dados():

  1. Não fica claro quais campos estão sendo retornados.

  2. Não fica claro quais deles vamos usar.

Em Python podemos nomear os campos no retorno. Ficaria assim:

(nome, data_admissao, cargo) = get_dados(algum_id)

Melhorou, mas ainda não sabemos quais campos vamos, de fato, usar.

Em Python existe a convenção de usar uma variável específica para esses casos, o "duplo underline" (__), ou dunder, que chamo de dummy object.

O mesmo exemplo acima ficaria assim, usando o dummy object:

(nome, __, __) = get_dados(algum_id)

Note que o primeiro item do return foi direto para a variável nome e os outros dois foram para a variável __, que é um dummy object.

De fato, o nome __ do dummy object não tem nada de especial, é apenas uma convenção. Ele poderia ter qualquer nome. Talvez nada:

(nome, nada, nada) = get_dados(algum_id)

Ou ainda, lixo:

(nome, lixo, lixo) = get_dados(algum_id)

Mas __ é muito mais explícito. O importante é usar um nome de variável que deixe claro sua intenção de não usá-la.

Dummy objects são úteis para desempacotar listas. Veja o mesmo exemplo acima escrito de forma um pouco mais resumida:

(nome, *__) = get_dados(algum_id)

Novamente, o primeiro item do return foi para a variável nome. O restante foi para __. Se não ficou claro, sugiro ler o artigo Como dividir uma string com delimitador.

Nesse exemplo acima o ganho não foi tão grande assim, mas se tivéssemos muitos itens no return, escreveríamos bem menos código.

Como eu disse, dummy object é uma convenção bastante usada em Python e seu nome não precisa ser o __. O importante é a intenção de não usar essa variável.

Cuidado com o underline simples

Muitas pessoas usam o dummy object como um underline simples (_), mas eu não recomendo isso por dois motivos:

  1. O _ é comumente usado como um alias para a engine de tradução: _("Corrija os dados"). Leia mais na documentação do módulo gettext.

  2. No modo interativo, o _ é usado para guardar o resultado da última expressão executada.

Leia essas referências sobre o uso do underline simples:

Vinicius Assef

Eu sou apaixonado por Python e shell script.

Aprenda com seus erros e dê nome certo às coisas.