programa
if __name__ == "__main__" Python: Explicação completa
O bloco condicional que começa com if __name__ == "__main__"
aparece com frequência em código Python. Essa linha pode parecer enigmática, e muitos iniciantes a usam sem saber o que ela faz ou se deveriam usá-la. Os programadores que vêm de outras linguagens também podem não entender e usar demais essa expressão.
Neste tutorial, você vai se aprofundar no significado da expressão if__name__ == "__main__"
do Python e explorar como e quando usá-la.
Torne-se um engenheiro de dados
Compreensão __name__
e "__main__"
A expressão if __name__ == "__main__"
é uma declaração if
que verifica a igualdade.
O primeiro operando à esquerda do operador de igualdade ==
é o atributo __name__
. Os nomes em Python com sublinhados duplos à esquerda e à direita são identificadores especiais. Cada módulo tem um atributo __name__
. O Python define essa variável como o nome do módulo, que o sistema de importação do Python usa para identificar cada módulo de forma exclusiva.
No entanto, se o módulo estiver no ambiente de código de nível superior, o que significa que é o módulo usado como ponto de entrada para o programa, o Python define o atributo __name__
como a string "__main__"
.
Vamos dar uma olhada em alguns exemplos. Vamos criar um script chamado exploring_name_main.py
:
# exploring_name_main.py
import random
print(__name__)
print(random.__name__)
Esse script pode ser executado diretamente usando o seguinte comando no terminal:
$ python exploring_name_main.py
__main__
random
O script exploring_name_main.py
está no ambiente de código de nível superior, pois é o ponto de entrada do programa. Portanto, a variável __name__
é definida como a string "__main__"
.
No entanto, o módulo random
é importado e não está no ambiente de código de nível superior. Seu atributo __name__
é definido como o nome do módulo.
Em seguida, criamos um novo script chamado more_exploration.py
, que importa o primeiro script:
# more_exploration.py
import exploring_name_main
Execute esse script usando o seguinte comando no terminal:
$ python more_exploration.py
exploring_name_main
random
O código de um módulo é executado quando o módulo é importado. Portanto, ao executar more_exploration.py
, o código exibe a saída das duas chamadas print()
em exploring_name_main.py
. Como exploring_name_main.py
não é mais o ponto de entrada do programa, seu atributo __name__
é definido como o nome do script em vez de "__main__"
.
O if __name__ == "__main__"
bloco condicional
A variável __name__
pode ser usada para determinar se um módulo é o ponto de entrada principal de um programa. Portanto, um módulo pode incluir código que só é executado quando você o executa diretamente como um script, mas não quando é importado. Qualquer código que deva ser executado somente quando o script for executado diretamente é incluído no bloco condicional if __name__ == "__main__"
:
# exploring_name_main.py
import random
print(__name__)
print(random.__name__)
number = random.randint(1, 10)
if __name__ == "__main__":
print("This script is in the top-level code environment")
print(f"The number is {number}")
O código em exploring_name_main.py
agora inclui um bloco condicional if __name__ == "__main__"
. Vamos ver se isso faz diferença quando você executa o script:
$ python exploring_name_main.py
__main__
random
This script is in the top-level code environment
The number is 10
Quando o script é executado diretamente, a variável __name__
é definida como a string "__main__"
. Portanto, a condição na instrução if
é avaliada como True
, e o Python executa o código no bloco if
.
Entretanto, quando o módulo é importado, __name__
é definido com o nome do módulo e o programa não executa o bloco if
. Lembre-se de que o script more_exploration.py
importa exploring_name_main
:
$ python more_exploration.py
exploring_name_main
random
O programa não chama as funções print()
em exploring_name_main.py
. Elas estão no bloco condicional que não é executado, pois __name__
não é igual a "__main__"
.
Práticas recomendadas e dicas para você usar o Python if __name__ == "__main__"
A expressão if __name__ == "__main__"
do Python é usada quando o código deve ser executado somente quando um arquivo é executado como um script em vez de ser importado como um módulo. A distinção entre os termos script e módulo está apenas na forma como o arquivo é usado. Ambos os termos se referem a arquivos com a extensão .py
.
Um caso de uso comum é quando um script tem variáveis, funções e classes que podem ser usadas em outros programas. Aqui está um exemplo usando um script chamado shapes.py
:
# shapes.py
import math
def find_area_of_circle(radius):
return math.pi * radius ** 2
def find_area_of_rectangle(width, height):
return width * height
if __name__ == "__main__":
shape = int(input("Enter 1 for circle, 2 for rectangle: "))
if shape == 1:
radius = int(input("Enter radius: "))
print(f"The area of the circle is {find_area_of_circle(radius)}")
elif shape == 2:
width = int(input("Enter width: "))
height = int(input("Enter height: "))
print(f"The area of the rectangle is {find_area_of_rectangle(width, height)}")
Enter 1 for circle, 2 for rectangle: 2
Enter width: 10
Enter height: 20
The area of the rectangle is 200
Esse código não precisa da expressão if __name__ == "__main__"
se a intenção for sempre executá-lo como um script. Entretanto, a inclusão dessa instrução condicional permite que o código seja importado como um módulo sem executar as linhas no bloco if
. Considere outro script chamado more_shapes.py
:
# more_shapes.py
import shapes
radius = 5
print(f"The area of the circle defined in 'more_shapes.py' is: "
f"{shapes.find_area_of_circle(radius)}")
The area of the circle defined in 'more_shapes.py' is: 78.53981633974483
Esse novo script, more_shapes.py
, tem acesso às funções definidas em shapes.py
por causa da instrução import. No entanto, o código no bloco if __name__ == "__main__"
em shapes.py
não é executado. Sem a instrução if
em shapes.py
, todo o código seria executado quando o módulo fosse importado.
O uso do bloco if __name__ == "__main__"
para entrada do usuário é um caso de uso comum. A entrada do usuário é omitida se o arquivo for importado como um módulo, mas é incluída quando executada diretamente como código de nível superior.
Uso de uma main()
função
A prática recomendada é incluir o menor número possível de instruções no bloco if __name__ == "__main__"
, pois isso torna o código mais legível. Uma maneira comum de conseguir isso é criar uma função, que é chamada no bloco condicional. É comum que essa função seja chamada de main()
, mas qualquer nome de função é válido:
# shapes.py
import math
def find_area_of_circle(radius):
return math.pi * radius ** 2
def find_area_of_rectangle(width, height):
return width * height
def main():
shape = int(input("Enter 1 for circle, 2 for rectangle: "))
if shape == 1:
radius = int(input("Enter radius: "))
print(f"The area of the circle is {find_area_of_circle(radius)}")
elif shape == 2:
width = int(input("Enter width: "))
height = int(input("Enter height: "))
print(f"The area of the rectangle is {find_area_of_rectangle(width, height)}")
if __name__ == "__main__":
main()
O código na função main()
é o mesmo código que foi incluído diretamente no bloco if __name__ == "__main__"
na versão anterior do código.
Em Python, a função main()
não é necessária como o ponto de entrada principal do programa, ao contrário de outras linguagens de programação. Portanto, o uso de main()
e da expressão if __name__ == "__main__"
é opcional e só é necessário quando o código se destina a ser usado como um script autônomo e como um módulo.
Outro caso de uso comum para o if __name__ == "__main__"
do Python é para incluir testes no script. Os testes serão executados quando o script for executado diretamente, mas não quando ele for importado de outro módulo. No entanto, embora essa abordagem seja adequada para casos simples, é melhor incluir testes em um módulo separado dedicado a testes.
Conclusão
O if __name__ == "__main__"
do Python é útil para incluir código que é executado somente quando um script é executado diretamente, mas não quando é importado. O interpretador do Python define a variável __name__
como o nome do módulo se ele for importado e como a string "__main__"
se o módulo for o ponto de entrada principal do programa.
Diferentemente de outras linguagens de programação, a função main()
e a expressão if __name__ == "__main__"
não são um requisito para executar o código Python, mas são uma ferramenta que o programador pode usar quando necessário.
Torne-se um engenheiro de dados
Estudei Física e Matemática em nível superior na Universidade de Malta. Depois, mudei-me para Londres e fiz meu doutorado em Física no Imperial College. Trabalhei em novas técnicas ópticas para obter imagens da retina humana. Agora, meu foco é escrever sobre Python, comunicar sobre Python e ensinar Python.
Principais cursos de engenharia de dados
curso
ETL e ELT em Python
curso