Я ищу, какой тип кода я бы разместил в файлах __init__.py
, и каковы наилучшие методы, связанные с этим. Или это вообще плохая практика?
Любая ссылка на известные документы, которые объясняют это, также очень ценится.
Я ищу, какой тип кода я бы разместил в файлах __init__.py
, и каковы наилучшие методы, связанные с этим. Или это вообще плохая практика?
Любая ссылка на известные документы, которые объясняют это, также очень ценится.
Библиотеки и фреймворки обычно используют код инициализации в файлах __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
. Это всего лишь один пример, но вы можете увидеть такие примеры в других средах и библиотеках.
Одна из лучших практик в этой области - импортировать все необходимые классы из вашей библиотеки (например, mongoengine). Таким образом, пользователь вашей библиотеки может это сделать:
from coollibrary import OneClass, SecondClass
вместо
from coollibrary.package import OneClass
from coollibrary.anotherpackage import SecondClass
Кроме того, хорошая практика включает в себя __init__.py
константу версии
Для удобства: другим пользователям не нужно знать точное расположение ваших функций.
your_package/
__init__.py
file1.py/
file2.py/
...
fileN.py
# in __init__.py
from file1 import *
from file2 import *
...
from fileN import *
# in file1.py
def add():
pass
то другие могут вызвать add() на
from your_package import add
без знания файла1, например
from your_package.file1 import add
Поместите что-нибудь для инициализации. Например, запись (это должно быть указано на верхнем уровне):
import logging.config
logging.config.dictConfig(Your_logging_config)