Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Dúvida - aula 08 vídeo 6

Não entendi como funciona o trecho:

if (__name__ == "__main__"):
    jogar()

__name__ é uma variável pré-definida do Python? O que ela representa? Como funciona para que ela só execute o meu programa quando eu selecionar a opção correspondente no main?

1 resposta
solução!

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__