Olá Nauana,
Sempre que o interpretador Python lê um arquivo de origem, ele faz duas coisas:
Define algumas variáveis especiais como
__name__
e depois ele executa todo o código encontrado no arquivo.
Suponha um arquivo foo.py com o seguinte conteúdo:
print("antes de importar")
import math
print("antes de functionA")
def functionA():
print("Function A")
print("antes de functionB")
def functionB():
print("Function B {}".format(math.sqrt(100)))
print("antes da guarda __name__ ")
if __name__ == '__main__':
functionA()
functionB()
print("depois da guarda __name__ ")
Se você estiver executando seu módulo (o arquivo de origem) como o programa principal. Exemplo, usando esse comando no prompt:
python foo.py
O interpretador atribuirá a variável name o conteúdo main , ou seja, é como se o interpretador inserisse isso no topo do seu módulo quando executado como o programa principal.
__name__ = "__main__"
Por outro lado, suponha que algum outro módulo seja o programa principal e importe seu módulo. Isto significa que há uma declaração como esta no programa principal, ou em algum outro módulo importado pelo programa principal:
Suponha que isso esteja em algum outro programa principal.
import foo
Neste caso, o interpretador irá olhar o nome do arquivo do seu módulo, foo.py, retirar o .py e atribuir essa string à variável
__name__
do seu módulo, ou seja,
É como se o interpretador inserisse isso no topo do seu módulo quando ele é importado de outro módulo.
__name__ = "foo"
Em resumo, aqui está o que seria impresso nos dois casos:
O que é impresso se foo é o programa principal
antes de importar
antes de functionA
antes do functionB
antes da guarda __name__
Função A
Função B 10.0
depois da guarda __name__
O que é impresso se foo é importado como um módulo regular
antes de importar
antes de functionA
antes do functionB
antes da guarda __name__
depois da guarda __name__