Antes de explicar qualquer coisa if __name__ == '__main__'
, é importante entender o que __name__
é e o que faz.
O que é __name__
?
__name__
é um DunderAlias - pode ser pensado como uma variável global (acessível a partir de módulos) e funciona de maneira semelhante a global
.
É uma string (global como mencionado acima), conforme indicado por type(__name__)
(yield <class 'str'>
), e é um padrão embutido para as versões Python 3 e Python 2 .
Onde:
Ele não pode ser usado apenas em scripts, mas também pode ser encontrado no interpretador e nos módulos / pacotes.
Intérprete:
>>> print(__name__)
__main__
>>>
Roteiro:
test_file.py :
print(__name__)
Resultando em __main__
Módulo ou pacote:
somefile.py:
def somefunction():
print(__name__)
test_file.py:
import somefile
somefile.somefunction()
Resultando em somefile
Observe que, quando usado em um pacote ou módulo, __name__
leva o nome do arquivo. O caminho do módulo ou pacote real não é fornecido, mas possui seu próprio DunderAlias __file__
, que permite isso.
Você deve ver que, onde __name__
, onde está o arquivo principal (ou programa) sempre retornará __main__
e, se for um módulo / pacote, ou qualquer coisa que esteja executando algum outro script Python, retornará o nome do arquivo onde está se originou de.
Prática:
Ser uma variável significa que seu valor pode ser substituído ("can" não significa "deveria"), substituindo o valor de__name__
resultará em falta de legibilidade. Portanto, não faça isso, por qualquer motivo. Se você precisar de uma variável, defina uma nova variável.
Sempre se assume que o valor de __name__
to be __main__
ou o nome do arquivo. Mais uma vez, alterar esse valor padrão causará mais confusão de que será bom, causando problemas mais adiante.
exemplo:
>>> __name__ = 'Horrify' # Change default from __main__
>>> if __name__ == 'Horrify': print(__name__)
...
>>> else: print('Not Horrify')
...
Horrify
>>>
É considerado uma boa prática em geral incluir os if __name__ == '__main__'
scripts.
Agora, para responder if __name__ == '__main__'
:
Agora sabemos que o comportamento das __name__
coisas se torna mais claro:
An if
é uma instrução de controle de fluxo que contém o bloco de código que será executado se o valor fornecido for verdadeiro. Vimos isso__name__
pode levar
__main__
ou o nome do arquivo do qual foi importado.
Isso significa que se __name__
é igual a__main__
, o arquivo deve ser o arquivo principal e realmente estar em execução (ou é o intérprete), não um módulo ou pacote importado para o script.
Se de fato __name__
leva o valor de__main__
, o que estiver nesse bloco de código será executado.
Isso nos diz que, se o arquivo em execução é o arquivo principal (ou você está executando diretamente do intérprete), essa condição deve ser executada. Se for um pacote, não deve, e o valor não será __main__
.
Módulos:
__name__
também pode ser usado em módulos para definir o nome de um módulo
Variantes:
Também é possível fazer outras coisas menos comuns, mas úteis __name__
, algumas que mostrarei aqui:
Executando apenas se o arquivo for um módulo ou pacote:
if __name__ != '__main__':
# Do some useful things
Executando uma condição se o arquivo for o principal e outro se não for:
if __name__ == '__main__':
# Execute something
else:
# Do some useful things
Você também pode usá-lo para fornecer funções / utilitários de ajuda executáveis em pacotes e módulos sem o uso elaborado de bibliotecas.
Ele também permite que os módulos sejam executados a partir da linha de comando como scripts principais, o que também pode ser muito útil.
if __name__ == "__main__":
condição do bloco foi descontinuada / obsoleta até o Python 3? Eu encontrei algumas informações afirmando isso.