Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

comando __name__ == "__main__"

alguem poderia me dizer como esse comando funciona de forma mais didatica? li esse artigo: https://www.alura.com.br/artigos/o-que-significa-if-name-main-no-python mas ainda estou com dificuldade de ententer.

o que eu entendi é que name significa o nome do modulo, e que quando o modulo roda por sí só ele define name para main . porem como ele faz isso eu nao entendi.

2 respostas
solução!

Olá,

Em Python, quando criamos um módulo, criamos um contexto onde poderemos criar variáveis, funções etc.

Nesse contexto, além das variáveis e funções que criamos, o Python tbm cria algumas variáveis e funções. Alguns exemplos são __name__ e __file__, variáveis criadas pelo Python para se referir ao próprio módulo. Como se vc falasse eu mesmo.

  • __name__ é a variável que guarda o nome do módulo/contexto.
  • __main__ será o valor da variável __name__ do módulo principal.
  • Em todos os outros módulos, __name__ guardará o nome do módulo.

Um exemplo

Crie dois módulos, modulo1.py e modulo2.py

No modulo1, insira o seguinte código:

# -*- coding: utf-8 -*-
# modulo1.py
print('Variáveis no modulo1')
print(__name__)
print(__file__)

print('\nImportando modulo2\n')
import modulo2

No modulo2, insira o seguinte código:

# -*- coding: utf-8 -*-
# modulo2.py
print('Variáveis no modulo2')
print(__name__)
print(__file__)

Execute python modulo1.py. A saída será algo como:

Variáveis no modulo1
__main__
/.../modulo1.py

Importando modulo2

Variáveis no modulo2
modulo2
/.../modulo2.py

Duas coisas importantes:

  1. Veja que o quando vc importa um módulo a partir de outro, o Python já executa o código do módulo importado. Esse é o comportamento padrão dele. Para impedir isso, criamos funções. Se o código do módulo2 estivesse envolvido em uma função, não seria executado pelo Python, somente lido.

  2. Ao executar o código do modulo2, ele exibiu o valor da variável name, que lá é modulo2. Ou seja, main será sempre seu módulo de entrada, seu entry point. Os demais, será sempre o nome do próprio módulo.

Por isso, podemos utilizar, quando necessário, o if __name__ == '__main__'. Essa expressão impede que um módulo que esteja sendo importando por outro, seja executado, pois verifica se o nome do módulo for __main__ele chama alguma função, do contrário não.

Para testar isso, altere seu modulo2 para:

# -*- coding: utf-8 -*-
# modulo2.py
def func():
    print('Variáveis no modulo2')
    print(__name__)
    print(__file__)

Execute novamente python modulo1.py. Verá que a saída será algo como:

Variáveis no modulo1
__main__
/.../modulo1.py

Importando modulo2

Ou seja, o código não foi executado, somente lido.

Caso queira executar o código, é só adicionar ao final do modulo1 o seguinte código:


modulo2.func()

[]'s

obrigado, ficou muito mais claro para mim agora.