Зачем мне помещать код Python в файлы __init__.py - PullRequest
60 голосов
/ 29 апреля 2011

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

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

Ответы [ 3 ]

56 голосов
/ 29 апреля 2011

Библиотеки и инфраструктуры обычно используют код инициализации в файлах __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.Это только один пример, но вы можете увидеть подобные примеры в других средах и библиотеках.

10 голосов
/ 29 апреля 2011

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

from coollibrary import OneClass, SecondClass

вместо

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

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

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

    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
    

    не зная file1, например

    from your_package.file1 import add
    
  2. Положите что-нибудь для инициализации.Например, ведение журнала (это должно быть на верхнем уровне):

    import logging.config
    logging.config.dictConfig(Your_logging_config)
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...