É apenas uma preferência pessoal, na verdade, e tem a ver com o layout de seus módulos Python.
Digamos que você tenha um módulo chamado erikutils
. Pode ser um módulo de duas maneiras: você tem um arquivo chamado erikutils.py em seu computadorsys.path
ou um diretório chamado erikutils em seu sys.path
com um __init__.py
arquivo vazio dentro dele. Então, digamos que você tem um monte de módulos chamados fileutils
, procutils
, parseutils
e você quer aqueles para ser sub-módulos menores erikutils
. Então, você faz alguns arquivos .py chamados fileutils.py , procutils.py e parseutils.py :
erikutils
__init__.py
fileutils.py
procutils.py
parseutils.py
Talvez você tem algumas funções que simplesmente não pertencem nos fileutils
, procutils
ou parseutils
módulos. E digamos que você não queira criar um novo módulo chamado miscutils
. E, você gostaria de poder chamar a função assim:
erikutils.foo()
erikutils.bar()
ao invés de fazer
erikutils.miscutils.foo()
erikutils.miscutils.bar()
Portanto, como o erikutils
módulo é um diretório, não um arquivo, temos que definir suas funções dentro do __init__.py
arquivo.
Em django, o melhor exemplo que posso pensar é django.db.models.fields
. TODAS as classes django * Field são definidas no __init__.py
arquivo no diretório django / db / models / fields . Eu acho que eles fizeram isso porque não queria empinar tudo em uma hipotética / db / modelos / fields.py django modelo, para que eles dividi-lo para fora em algumas sub-módulos ( related.py , files.py , por exemplo) e eles colaram as definições de * Field feitas no próprio módulo de campos (portanto, __init__.py
).