Python com __main__

 python

Em Python (CPython), quando se importa um arquivo ou pacote, todo conteúdo é lido e executado, sabendo disso temos um arquivo que processa alguma informação:

def processa_texto():
    [...]

def recupera_conteudo_arquivo():
    [...]

def main():
    [...]

main()

Nota: o conteúdo não nos interessa, apenas o conceito é necessário.

Para executarmos o arquivo, supondo que seu nome é processamento.py, fazemos:

$ python processamento.py

Até este momento nada de novidade, mas e se eu precisar importar o arquivo processamento.py dentro de outro? Lembra do primeiro paragráfo?

Se fizermos:

import processamento

Poderiamos utilizar o conteúdo do arquivo, mas na importação ele seria executado. Vamos a um exemplo mais simples ainda que demonstra de forma prática isto.

Neste contexto de execução na importação, vamos ao exemplo, com os arquivos teste.py e teste2.py:

$ cat teste.py
print __name__

$ cat teste2.py
import teste

Se fizermos:

$ python teste.py
__main__

$ python teste2.py
teste

Comportamentos esperados:

  • No primeiro caso (executar o arquivo via linha de comando), __name__ assume o valor de __main__
  • No segundo (importar o arquivo) assume valor de teste (nome do arquivo a ser importado sem o .py,

Lembrando que dentro de teste.py existia um print, então vemos que ele realmente executa o arquivo na importação.

Agora abriremos o teste.py e colocaremos:

if __name__ == "__main__":
    print __name__

E realizamos o teste novamente:

$ python teste.py
__main__

$ python teste2.py

Agora na execução de teste2.py, não é mais executado o print, justamente por incluirmos o if. Somente quando __name__ for igual a __main__ ou seja, seja executado via linha de comando ele vai executar o conteúdo do if.

Espero que o conteúdo tenha sido bem esclarecido, bons códigos a tod*s.


comments powered by Disqus