Подтвердить что ты не робот

Почему я должен помещать код python в файлы __init__.py

Я ищу, какой тип кода я бы разместил в файлах __init__.py, и каковы наилучшие методы, связанные с этим. Или это вообще плохая практика?

Любая ссылка на известные документы, которые объясняют это, также очень ценится.

4b9b3361

Ответ 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. Это всего лишь один пример, но вы можете увидеть такие примеры в других средах и библиотеках.

Ответ 2

Одна из лучших практик в этой области - импортировать все необходимые классы из вашей библиотеки (например, mongoengine). Таким образом, пользователь вашей библиотеки может это сделать:

from coollibrary import OneClass, SecondClass

вместо

from coollibrary.package import OneClass
from coollibrary.anotherpackage import SecondClass

Кроме того, хорошая практика включает в себя __init__.py константу версии

Ответ 3

  • Для удобства: другим пользователям не нужно знать точное расположение ваших функций.

    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)