Это действительно личное предпочтение, и оно связано с компоновкой ваших модулей 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 * определены в файле __init__.py
в каталоге django / db / models / fields . Я думаю, что они сделали это, потому что они не хотели втиснуть все в гипотетическую django / db / models / fields.py модель, поэтому они разбили ее на несколько подмодулей ( related.py , files.py , например), и они прикрепили сделанные * определения полей в самом модуле полей (следовательно, __init__.py
).