Autor: Valdir Stumm JrJá viu algum programa escrito em Python, que lá pelo final tem um trecho de código parecido com o código abaixo?
12if__name__=="__main__":# faça algoQuem não conhece, deve estar se perguntando: que condição é essa? O que é __name__? O que é “__main__”?
Para entender isso, nada melhor que a prática. Faça o seguinte:
- Usando seu editor de textos favorito, crie um arquivo .py (por exemplo: teste.py);
- Dentro desse arquivo, coloque o seguinte código:
1__name__OK, criamos um programa/módulo python chamado teste. Isso quer dizer que podemos executá-lo pela linha de comando, ou importá-lo em um shell python. Agora vamos executá-lo como um programa:
123user@host:~/ $ python teste.py__main__Repare na saída que o programa gerou: __main__. Esse é o nome interno que todo programa/módulo Python recebe quando executado como um programa pela linha de comando.
Agora, abra um shell Python no mesmo diretório onde o arquivo teste.py foi gravado e importe tal módulo:
123456Python2.7.2+(default,Oct42011,20:06:09)[GCC4.6.1] on linux2Type"help","copyright","credits"or"license"formore information.>>>importtesteteste>>>Repare que agora, a variável __name__ foi impressa com um valor diferente: teste, que é o nome que demos ao nosso programa. Assim, o teste __name__ == “__main__” está verificando nada mais do que se o código do módulo está sendo executado como um programa, tendo sido chamado pela linha de comando, ou sendo importado como um módulo. Mas, pra que serve isso?
Vamos a outro exemplo. Vamos implementar um módulo com algumas funções que achamos úteis. Vamos chamar esse módulo como utilidades.py.
1234567891011121314importsysdeferro(msg):"Erro:", msgsys.exit(1)definc(x):returnx+1defdec(x):returnx-1defquadrado(x):returnx**2Mas, enquanto vamos implementando, queremos fazer alguns testes para saber se o código funciona como esperamos, então complementamos o código acima com uns testes ao final:
1234567891011121314151617importsysdeferro(msg):"Erro:", msgsys.exit(1)definc(x):returnx+1defdec(x):returnx-1defquadrado(x):returnx**2inc(10)# deve mostrar 11dec(10)# deve mostrar 9quadrado(5)# deve mostrar 25Perfeito, se executarmos o código acima pela linha de comando, teremos o resultado que esperamos:
1234user@host:~/ $ python utilidades.py11925Até aí, tudo certo. Mas, e se precisarmos de uma dessas funções e importarmos esse módulo (utilidades) em algum outro programa ou até mesmo em um shell Python? Vamos ver:
12345678Python2.7.2+(default,Oct42011,20:06:09)[GCC4.6.1] on linux2Type"help","copyright","credits"or"license"formore information.>>>importutilidades11925>>>Opa! “Mas eu queria apenas usar as funções que o módulo utilidades disponibiliza, não ver esses números na tela!”. Pois é. O problema é que as três linhas de código que finalizam o módulo estão sendo executadas de forma incondicional, não importando se o programa estiver sendo executado pela linha de comando ou sendo importado em outro programa. Podemos resolver esse problema adicionando o teste __name__ == “__main__”:
12345678910111213141516171819importsysdeferro(msg):"Erro:", msgsys.exit(1)definc(x):returnx+1defdec(x):returnx-1defquadrado(x):returnx**2if__name__=="__main__":inc(10)dec(10)quadrado(5)Agora, o comportamento do programa será diferente quando executado pela linha de comando (quando o __name__ for igual a string “__main__”), do que quando for importado como módulo.
Comentários