Це насправді лише особисті переваги, і це пов’язано з розташуванням ваших модулів 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 . Я припускаю , що вони зробили це , тому що вони не хочуть , щоб втиснути все в гіпотетичній Джанго / дб / моделі / fields.py моделі, тому вони розділили його на кілька подмодулей ( related.py , files.py , наприклад) і вони закріпили зроблені * визначення полів у самому модулі поля (отже, __init__.py
).