È solo una preferenza personale e ha a che fare con il layout dei tuoi moduli Python.
Supponiamo che tu abbia un modulo chiamato erikutils. Ci sono due modi in cui può essere un modulo, o hai un file chiamato erikutils.py sul tuo sys.patho hai una directory chiamata erikutils sul tuo sys.pathcon un __init__.pyfile vuoto al suo interno. Quindi diciamo che si dispone di un gruppo di moduli chiamati fileutils, procutils, parseutilse si desidera quelle da sottomoduli sotto erikutils. Quindi crei alcuni file .py chiamati fileutils.py , procutils.py e parseutils.py :
erikutils
__init__.py
fileutils.py
procutils.py
parseutils.py
Forse avete un paio di funzioni che semplicemente non appartengono nei fileutils, procutilso parseutilsmoduli. E diciamo che non hai voglia di creare un nuovo modulo chiamato miscutils. E, vorresti poter chiamare la funzione in questo modo:
erikutils.foo()
erikutils.bar()
piuttosto che fare
erikutils.miscutils.foo()
erikutils.miscutils.bar()
Quindi, poiché il erikutilsmodulo è una directory, non un file, dobbiamo definire le sue funzioni all'interno del __init__.pyfile.
In Django, il miglior esempio a cui riesco a pensare è django.db.models.fields. TUTTE le classi django * Field sono definite nel __init__.pyfile nella directory django / db / models / fields . Immagino che lo abbiano fatto perché non volevano stipare tutto in un ipotetico modello django / db / models / fields.py , quindi lo hanno diviso in alcuni sottomoduli ( related.py , files.py , per esempio) e hanno bloccato le definizioni * Field fatte nel modulo dei campi stesso (quindi, __init__.py).