DEV Community

Cover image for Entendendo o `if __name__ == "__main__"` no Python de forma prática
Felipe Cezar
Felipe Cezar

Posted on

Entendendo o `if __name__ == "__main__"` no Python de forma prática

Se você já viu Python por algum tempo, provavelmente encontrou algo assim:

if __name__ == "__main__":
    main()
Enter fullscreen mode Exit fullscreen mode

Esse trecho parece estranho no começo, mas a ideia é simples:

Ele serve para executar uma parte do código apenas quando aquele arquivo for executado diretamente.

Ou seja, ele ajuda a separar duas situações:

  1. Quando um arquivo Python é executado diretamente.
  2. Quando um arquivo Python é importado por outro arquivo.

E essa diferença importa bastante.


Primeiro: main.py não é a mesma coisa que "__main__"

Muita gente chama o arquivo principal de um projeto Python de main.py.

Por exemplo:

python main.py
Enter fullscreen mode Exit fullscreen mode

Mas isso é só uma convenção.

O arquivo poderia se chamar:

python app.py
Enter fullscreen mode Exit fullscreen mode

ou:

python calculadora.py
Enter fullscreen mode Exit fullscreen mode

ou:

python sistema.py
Enter fullscreen mode Exit fullscreen mode

O nome do arquivo não precisa ser main.py.

O ponto importante é:

O arquivo que você executa diretamente recebe o valor "__main__" dentro da variável __name__.

Então "__main__" não vem do nome main.py.

Ele vem do fato de aquele arquivo ser o ponto de entrada da execução.


O que é __name__?

Todo arquivo Python tem uma variável especial chamada __name__.

Ela muda dependendo de como o arquivo está sendo usado.

Se o arquivo for executado diretamente, __name__ vale:

"__main__"
Enter fullscreen mode Exit fullscreen mode

Se o arquivo for importado por outro arquivo, __name__ vale o nome do próprio módulo.

Vamos ver isso na prática.


Exemplo 1: executando o arquivo diretamente

Arquivo: calculadora.py

print(__name__)
Enter fullscreen mode Exit fullscreen mode

Agora execute no terminal:

python calculadora.py
Enter fullscreen mode Exit fullscreen mode

A saída será:

__main__
Enter fullscreen mode Exit fullscreen mode

Por quê?

Porque o arquivo calculadora.py foi executado diretamente.

Naquele momento, para o Python, ele é o arquivo principal da execução.


Exemplo 2: importando o arquivo

Agora imagine outro arquivo.

Arquivo: app.py

import calculadora
Enter fullscreen mode Exit fullscreen mode

Execute:

python app.py
Enter fullscreen mode Exit fullscreen mode

A saída será:

calculadora
Enter fullscreen mode Exit fullscreen mode

Agora o calculadora.py não foi executado diretamente.

Ele foi apenas importado pelo app.py.

Então, dentro de calculadora.py, o valor de __name__ não é "__main__".

É "calculadora".


Então o que significa if __name__ == "__main__"?

Significa:

"Execute esse bloco apenas se este arquivo for executado diretamente."

Veja este exemplo.

Arquivo: calculadora.py

def somar(a, b):
    return a + b

if __name__ == "__main__":
    print(somar(10, 5))
Enter fullscreen mode Exit fullscreen mode

Se você executar:

python calculadora.py
Enter fullscreen mode Exit fullscreen mode

A saída será:

15
Enter fullscreen mode Exit fullscreen mode

Isso acontece porque calculadora.py foi executado diretamente.

Então, dentro dele:

__name__ == "__main__"
Enter fullscreen mode Exit fullscreen mode

é verdadeiro.


Agora usando calculadora.py em outro arquivo

Arquivo: app.py

from calculadora import somar

resultado = somar(2, 3)
print(resultado)
Enter fullscreen mode Exit fullscreen mode

Execute:

python app.py
Enter fullscreen mode Exit fullscreen mode

A saída será:

5
Enter fullscreen mode Exit fullscreen mode

Repare que o print(somar(10, 5)) que está dentro de calculadora.py não foi executado.

Por quê?

Porque agora quem foi executado diretamente foi o app.py, não o calculadora.py.

A situação fica assim:

Dentro de app.py

__name__ == "__main__"
Enter fullscreen mode Exit fullscreen mode

Dentro de calculadora.py

__name__ == "calculadora"
Enter fullscreen mode Exit fullscreen mode

Por isso este bloco não roda:

Arquivo: calculadora.py

if __name__ == "__main__":
    print(somar(10, 5))
Enter fullscreen mode Exit fullscreen mode

O calculadora.py foi importado.

Ele não foi o arquivo principal da execução.


O que acontece se eu não usar isso?

O problema é que código solto dentro de um arquivo Python pode rodar automaticamente quando esse arquivo é importado.

Veja este exemplo.

Arquivo: relatorio.py

def gerar_relatorio():
    print("Gerando relatório...")

gerar_relatorio()
Enter fullscreen mode Exit fullscreen mode

Agora outro arquivo importa esse módulo.

Arquivo: app.py

import relatorio

print("Sistema iniciado")
Enter fullscreen mode Exit fullscreen mode

Execute:

python app.py
Enter fullscreen mode Exit fullscreen mode

A saída será:

Gerando relatório...
Sistema iniciado
Enter fullscreen mode Exit fullscreen mode

Mas repare: em app.py, você não chamou gerar_relatorio().

Mesmo assim, a função rodou.

Ela rodou porque estava solta dentro de relatorio.py.

Quando o Python importou relatorio.py, ele executou o código que estava no arquivo.


Por que isso é um problema?

Em um exemplo simples, isso só gera um print inesperado.

Mas em projetos reais, isso pode causar problemas maiores, como:

  • chamadas de API acontecendo sem querer;
  • consultas ao banco de dados só por causa de um import;
  • arquivos sendo criados, lidos ou alterados no momento errado;
  • funções rodando antes da hora;
  • testes ficando confusos;
  • código difícil de reaproveitar;
  • comportamento inesperado na aplicação.

Ou seja, sem esse cuidado, importar um arquivo pode fazer mais coisa do que deveria.


A versão correta

Agora veja a versão melhorada.

Arquivo: relatorio.py

def gerar_relatorio():
    print("Gerando relatório...")

if __name__ == "__main__":
    gerar_relatorio()
Enter fullscreen mode Exit fullscreen mode

Arquivo: app.py

import relatorio

print("Sistema iniciado")
Enter fullscreen mode Exit fullscreen mode

Execute:

python app.py
Enter fullscreen mode Exit fullscreen mode

A saída será:

Sistema iniciado
Enter fullscreen mode Exit fullscreen mode

Agora o relatório não é gerado automaticamente.

Por quê?

Porque relatorio.py foi importado, não executado diretamente.

Se você quiser executar o relatório diretamente, aí sim:

python relatorio.py
Enter fullscreen mode Exit fullscreen mode

A saída será:

Gerando relatório...
Enter fullscreen mode Exit fullscreen mode

Nesse caso, relatorio.py virou o arquivo principal da execução.

Então, dentro dele:

__name__ == "__main__"
Enter fullscreen mode Exit fullscreen mode

é verdadeiro.


E a função main()?

É muito comum ver este padrão:

Arquivo: main.py

def main():
    print("Programa iniciado")

if __name__ == "__main__":
    main()
Enter fullscreen mode Exit fullscreen mode

A função main() não é obrigatória.

Ela é apenas uma forma organizada de concentrar o ponto inicial do programa.

Você poderia escrever assim:

Arquivo: main.py

print("Programa iniciado")
Enter fullscreen mode Exit fullscreen mode

Isso funciona.

Mas em projetos maiores, geralmente fica melhor separar as coisas.

Exemplo:

Arquivo: main.py

def carregar_dados():
    print("Carregando dados...")

def processar_dados():
    print("Processando dados...")

def salvar_resultado():
    print("Salvando resultado...")

def main():
    carregar_dados()
    processar_dados()
    salvar_resultado()

if __name__ == "__main__":
    main()
Enter fullscreen mode Exit fullscreen mode

Esse padrão deixa claro qual é o fluxo principal do programa.

As funções ficam disponíveis para serem reutilizadas, mas a execução principal só acontece quando o arquivo é executado diretamente.


Então por que usar if __name__ == "__main__"?

Use quando um arquivo Python pode ser:

  1. Executado diretamente.
  2. Importado por outro arquivo.

Ele evita que código rode sem querer durante um import.

Na prática, ele diz:

"Essa parte aqui só deve rodar se este arquivo for o ponto de entrada da aplicação."


Regra prática

Se o arquivo só tem funções, classes ou constantes, talvez você não precise dele.

Exemplo:

Arquivo: operacoes.py

def somar(a, b):
    return a + b

def subtrair(a, b):
    return a - b
Enter fullscreen mode Exit fullscreen mode

Esse arquivo só oferece funções para outros arquivos usarem.

Agora, se o arquivo também tem uma execução principal, use o if.

Arquivo: operacoes.py

def somar(a, b):
    return a + b

def subtrair(a, b):
    return a - b

if __name__ == "__main__":
    print(somar(10, 5))
    print(subtrair(10, 5))
Enter fullscreen mode Exit fullscreen mode

Assim, se você executar diretamente:

python operacoes.py
Enter fullscreen mode Exit fullscreen mode

A saída será:

15
5
Enter fullscreen mode Exit fullscreen mode

Mas se outro arquivo importar operacoes.py, esses prints não vão rodar automaticamente.


Resumo direto

Quando você executa um arquivo diretamente:

python app.py
Enter fullscreen mode Exit fullscreen mode

dentro de app.py, o Python define:

__name__ = "__main__"
Enter fullscreen mode Exit fullscreen mode

Quando você importa um arquivo:

Arquivo: app.py

import calculadora
Enter fullscreen mode Exit fullscreen mode

dentro de calculadora.py, o Python define:

__name__ = "calculadora"
Enter fullscreen mode Exit fullscreen mode

Então este código:

Arquivo: calculadora.py

if __name__ == "__main__":
    print("Rodando diretamente")
Enter fullscreen mode Exit fullscreen mode

significa:

"Só execute esse bloco se o arquivo calculadora.py for executado diretamente."

Se rodar:

python calculadora.py
Enter fullscreen mode Exit fullscreen mode

o bloco executa.

Se fizer:

Arquivo: app.py

import calculadora
Enter fullscreen mode Exit fullscreen mode

o bloco não executa.


Conclusão

O if __name__ == "__main__" existe para evitar execução acidental de código quando um arquivo Python é importado.

Ele separa bem duas intenções:

  • importar um arquivo para usar suas funções, classes e variáveis;
  • executar um arquivo como programa principal.

A ideia central é simples:

"__main__" é o nome que o Python dá ao arquivo que foi executado diretamente.

Então este padrão:

Arquivo: main.py

def main():
    print("Programa iniciado")

if __name__ == "__main__":
    main()
Enter fullscreen mode Exit fullscreen mode

significa:

"Execute main() apenas se este arquivo for o ponto de entrada do programa."

É simples, evita comportamento inesperado e deixa o código mais organizado.

Top comments (0)