if __name__ == ‘__main__’ Python

if __name__ == ‘__main__’ Python

Se você começou com Python a pouco tempo certamente já bateu de cara com o __name__ == ‘__main__’ e está se perguntando até agora que raios é isso.

Todo código Python quando é executado faz duas coisas básicas:

  • Atribui valores a algumas variáveis especiais;
  • Executa o código existente.

Executar o código existente não é nenhum segredo, mas atribuir valores a variáveis especiais como a __name__ de repente pode ser uma novidade para você. Essa atribuição serve para que o interpretador Python possa identificar o contexto em que o módulo está inserido. Quando falo em módulo, me refiro a todo e qualquer arquivo .py.

Quando um módulo é executado “por si só”, digamos assim, o que é atrobuído a __name__ é o próprio módulo com a string “__main__”. Vou apresentar alguns exemplos e fazer a conclusão no fim para ficar mais fácil o entendimento.

Vamos a um exemplo absurdamente simples para ficar mais claro. Crie um módulo com uma função que printe apenas “Hello world” e de o nome de helloworld.py. Em seguida, execute esse módulo:

def printhello():
    print("Hello world")

Ao executar, nada acontece, beleza… Agora volte no arquivo e adicione mais um print, sendo que agora fora da sua função para forçar sua execução independete do contexto em que é executado.

def printhello():
    print("Hello world")

print(__name__)

O resultado será:

>> __main__

Agora volte no arquivo e adicione o tão questionado name == main e ponha a chamada de sua função dentro dele:

if __name__ == '__main__':
    printhello()

Em sua próxima execução, você receberá:

>> Hello world
>> __main__

Agora, se você importar um módulo dentro do outro, a chamada do primeiro módulo será diferente pois houve uma mudança de contexto. Vamos novamente a um exemplo básico. Crie um arquivo helloworld2.py, dentro dele adicione:

import helloword
print(helloword.__name__)

O resultado agora não será mais __main__ e sim o nome do módulo importado.

>> helloword

Beleza! Acho que até aqui está tudo claro, mas, por qual motivo precisamos adicionar if name == ‘main‘? Você faz essa verificação se quiser se certificar que somente na chamada do módulo com contexto main o código será executado. Vamos a outro exemplo muito siples.

No arquivo helloworld.py, faremos uma modificação. Por algum motivo eu quero executar um print, uma função ou seja lá o que for somente quando eu estiver no contexto atual. Para simplificar, vou adicionar um print 1 + 1:

def printhello():
    print("Hello world")

if __name__ == '__main__'
    print(1 + 1)

Ao rodar python holloworld.py, teremo:

>> 2

Agora eu só quero que esse print seja executando no contexto de helloworld. Vamos ao hellowworld2.py e mandademos executar a função printhello()

from hellowworld import printhello
printhello()

A saída agora será:

>> Hello world

Note que agora o inteiro 2 não foi printado pois o contexto era diferente.

Easpero que eu não tenha confundido ainda mais sua cabeça e que possa ter tirado de vez essa dúvida 🙂