На самом деле это просто личные предпочтения, и они связаны с компоновкой ваших модулей Python.
Допустим, у вас есть модуль с именем erikutils. Есть два способа , которыми это может быть модулем, либо у вас есть файл с именем erikutils.py на своем контекстуальном sys.pathили у вас есть каталог с именем erikutils на вашем sys.pathс пустым __init__.pyфайлом внутри него. Тогда скажем , у вас есть куча модулей , называемых fileutils, procutils, parseutilsи вы желаете, чтобы быть суб-модулей под erikutils. Таким образом , вы сделать некоторые .py файлы , называемые fileutils.py , procutils.py и parseutils.py :
erikutils
__init__.py
fileutils.py
procutils.py
parseutils.py
Может быть , у вас есть несколько функций , которые просто не принадлежат в fileutils, procutilsили parseutilsмодулях. Допустим, вам не хочется создавать новый модуль с именем miscutils. И вы хотите иметь возможность вызывать функцию следующим образом:
erikutils.foo()
erikutils.bar()
вместо того, чтобы делать
erikutils.miscutils.foo()
erikutils.miscutils.bar()
Так как erikutilsмодуль - это каталог, а не файл, мы должны определить его функции внутри __init__.pyфайла.
В django лучший пример, который я могу придумать, - это django.db.models.fields. ВСЕ классы django * Field определены в __init__.pyфайле в каталоге django / db / models / fields . Я думаю, они сделали это, потому что не хотели втиснуть все в гипотетическую модель django / db / models / fields.py , поэтому они разделили ее на несколько подмодулей ( например , related.py , files.py ) и они вставили сделанные * определения полей в сам модуль полей (следовательно, __init__.py).