На самом деле это просто личные предпочтения, и они связаны с компоновкой ваших модулей 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
).