Ответ 1
Библиотеки и фреймворки обычно используют код инициализации в файлах __init__.py
, чтобы аккуратно скрыть внутреннюю структуру и обеспечить единый интерфейс для пользователя.
Давайте рассмотрим пример модуля форм Django. Различные функции и классы в модуле форм определяются в разных файлах на основе их классификации.
forms/
__init__.py
extras/
...
fields.py
forms.py
widgets.py
...
Теперь, если бы вам нужно было создать форму, вам нужно было бы знать, в каком файле определяется каждая функция, а ваш код для создания контактной формы должен выглядеть примерно так (что является неэффективным и уродливым).
class CommentForm(forms.forms.Form):
name = forms.fields.CharField()
url = forms.fields.URLField()
comment = forms.fields.CharField(widget=forms.widgets.Textarea)
Вместо этого в Django вы можете просто ссылаться на различные виджеты, формы, поля и т.д. непосредственно из пространства имен форм.
from django import forms
class CommentForm(forms.Form):
name = forms.CharField()
url = forms.URLField()
comment = forms.CharField(widget=forms.Textarea)
Как это возможно? Чтобы это стало возможным, Django добавляет следующий оператор в файл forms/__init__.py
, который импортирует все виджеты, формы, поля и т.д. В пространство имен forms
.
from widgets import *
from fields import *
from forms import *
from models import *
Как вы можете видеть, это упрощает вашу жизнь при создании форм, потому что теперь вам не нужно беспокоиться о том, где каждая функция/класс определена, и просто использовать все это непосредственно из пространства имен forms
. Это всего лишь один пример, но вы можете увидеть такие примеры в других средах и библиотеках.