Đó thực sự chỉ là sở thích cá nhân và liên quan đến cách bố trí các mô-đun python của bạn.
Giả sử bạn có một mô-đun được gọi erikutils
. Có hai cách mà nó có thể là một mô-đun, hoặc là bạn có một tập tin gọi là erikutils.py trên của bạn sys.path
hoặc bạn có một thư mục gọi là erikutils trên của bạn sys.path
với một sản phẩm nào __init__.py
tập tin bên trong nó. Sau đó, giả sử bạn có một loạt các module gọi là fileutils
, procutils
, parseutils
và bạn muốn những là sub-module dưới erikutils
. Vì vậy, bạn tạo một số tệp .py có tên là fileutils.py , procutils.py và parseutils.py :
erikutils
__init__.py
fileutils.py
procutils.py
parseutils.py
Có lẽ bạn có một vài chức năng mà chỉ cần không thuộc trong fileutils
, procutils
hoặc parseutils
mô-đun. Và giả sử bạn không muốn tạo một mô-đun mới có tên miscutils
. VÀ, bạn muốn có thể gọi hàm như vậy:
erikutils.foo()
erikutils.bar()
thay vì làm
erikutils.miscutils.foo()
erikutils.miscutils.bar()
Vì vậy, bởi vì erikutils
mô-đun là một thư mục, không phải một tệp, chúng ta phải xác định các chức năng của nó bên trong __init__.py
tệp.
Trong django, ví dụ tốt nhất mà tôi có thể nghĩ đến là django.db.models.fields
. TẤT CẢ các lớp trường django * được định nghĩa trong __init__.py
tệp trong thư mục django / db / models / fields . Tôi đoán họ đã làm điều này bởi vì họ không muốn nhồi nhét mọi thứ vào một giả thuyết django / db / mô hình / fields.py mô hình, vì vậy họ chia nó ra thành một vài submodules ( related.py , files.py , ví dụ) và họ đã gắn các định nghĩa trường * được thực hiện trong chính mô-đun trường (do đó, __init__.py
).