Artigo original: What’s in a (Python’s) __name__?

Introdução sobre a variável _ _name_ _ e seu uso em Python

Você provavelmente já viu a variável __name__ ao examinar um código em Python. Abaixo, vemos um trecho de código de exemplo de como ela pode aparecer:

if __name__ == '__main__':    main()

Neste artigo, quero mostrar para você como você pode usar essa variável para criar módulos em Python.

Por que a variável _ _name_ _ é usada?

A variável __name__ (duas sublinhas antes e duas depois) é uma variável especial em Python. Ela obtém seu valor, dependendo de como executamos o script que a contém.

Às vezes, você escreve um script com funções que também podem ser úteis para outros scripts. Em Python, você pode importar esse script como um módulo em outro script.

Graças a essa variável especial, você pode decidir se quer executar o script ou se quer importar as funções definidas no script.

Que valores a variável __name__ poder conter?

Ao executar seu script, a variável __name__ é igual a __main__. Ao importar o script que a contém, ela terá o nome do script.

Vamos ver de perto esses dois casos de uso e descrever o processo com duas ilustrações.

Cenário 1 - Executar o script

Vamos supor que escrevemos o script nameScript.py conforme vemos abaixo:

def myFunction():    print 'The value of __name__ is ' + __name__
def main():    myFunction()
if __name__ == '__main__':    main()

Se executarmos nameScript.py, seguimos o processo abaixo.

PljpjxnM1OMMW7IkexNxVfwrKhP0RH-isapH

Antes de todo o resto do código ser executado, a variável __name__ é definida como __main__. Depois disso, as instruções def de main e myFunction são executadas. Como a condição é avaliada como verdadeira, a função principal (main, em inglês) é chamada. Ela, por sua vez, chama myFunction, que imprime o valor de __main__.

Cenário 2 - Importação do script em outro script

Se quiser reutilizar myFunction em outro script, por exemplo, em importingScript.py, podemos importar nameScript.py como um módulo.

O código em importingScript.py pode ser o seguinte:

import nameScript as ns
ns.myFunction()

Temos, então, dois escopos: um de importingScript e o segundo escopo, de nameScript. Na ilustração, você verá como isso é diferente do primeiro caso de uso.

k9OxzvJAP-s5qeZg88jUCOCVy1syrQu4oKds

Em importingScript.py, a variável __name__ é definida como __main__. Ao importar nameScript, o Python começa a procurar por um arquivo, adicionando .py ao nome do módulo. Em seguida, executa o código contido no arquivo importado.

Nesse momento, contudo, ele está definido como nameScript. Novamente, as instruções def para main e myFunction são executadas. Agora, no entanto, a condição é avaliada como falsa e main não é chamada.

Em importingScript.py, chamamos myFunction, que dá como resultado nameScript. NameScript é conhecido da função myFunction quando aquela função é definida.

Se você quiser imprimir __name__ em importingScript, ele retornará __main__. A razão para isso é o fato de que o Python usa o valor conhecido no escopo de importingScript.

Conclusão

Neste breve artigo, expliquei como você pode usar a variável __name__ para escrever módulos. Você também pode executar esses módulos sozinhos. Isso pode ser feito fazendo uso de como os valores dessas variáveis mudam, dependendo de onde elas ocorrem.