Por que o __init__.py é necessário, provavelmente qualquer pythonist sabe, mas e o __main__.py ? Eu já vi alguns projetos trabalhando ou no Github que não usam esse arquivo mágico, embora eles possam facilitar sua vida. Na minha opinião, __main__.py é a melhor maneira de interagir com módulos Python que consistem em vários arquivos.
Mas vamos acertar primeiro: como a maioria das pessoas executa seus scripts Python?
Depois de escrever um programa que você deseja usar como um módulo importado e como uma ferramenta iniciada na linha de comando. Você provavelmente sabe o que geralmente é feito neste caso:
if __name__ == '__main__': main(sys.argv)
Quando você alimenta o script para o intérprete, a variável global mágica __name__ obtém o valor __main__ . Assim, aprendemos que isso não é uma importação, mas um lançamento. Por exemplo:
python myapp.py
E isso funciona muito bem para um único arquivo.
O problema
Mas se você é como eu, não deseja que seu aplicativo inteiro seja compactado em um único arquivo. A divisão da lógica em arquivos diferentes simplifica a edição e o suporte. Por exemplo:
. ├── README.me ├── requirements.txt ├── setup.py └── src ├── __init__.py ├── client.py ├── logic.py ├── models.py └── run.py
Mas o usuário que clonou o projeto no repositório não entenderá - qual desses arquivos é o principal? O run.py é realmente? Ou talvez client.py ? Onde procurar a sequência familiar se __name__ == '__main__' ? É aqui que __main__.py é capaz de provar a si próprio.
__main__.py
O arquivo __main__.py é chamado quando o projeto inicia com o sinalizador de módulo - -m . E isso é muito conveniente se o código se destina ao uso como módulo e ao lançamento a partir do console. Pense nesse arquivo como um local para colocar tudo o que você normalmente coloca se __name__ == ' __main__' . Vamos mudar o projeto do exemplo acima de acordo:
. ├── README.me ├── requirements.txt ├── setup.py └── myapp ├── __init__.py ├── __main__.py ├── client.py ├── logic.py ├── models.py
E pronto! Agora você pode simplesmente iniciar o projeto como um módulo regular.
python -m myapp
__main__.py será executado automaticamente. Este é o lugar perfeito para hospedar a interface da linha de comandos e lidar com argumentos de entrada!