Для чего нужен файл init py
Как работают импорты в Python
Порой бывает трудно правильно реализовать import с первого раза, особенно если мы хотим добиться правильной работы на плохо совместимых между собой версиях Python 2 и Python 3. Попытаемся разобраться, что из себя представляют импорты в Python и как написать решение, которое подойдёт под обе версии языка.
Содержание
Ключевые моменты
Основные определения
Пример структуры директорий
Что делает import
Основы import и sys.path
Вот как оператор import производит поиск нужного модуля или пакета согласно документации Python:
Программы могут изменять переменную sys.path после её инициализации. Директория, содержащая запускаемый скрипт, помещается в начало поиска перед путём к стандартной библиотеке. Это значит, что скрипты в этой директории будут импортированы вместо модулей с такими же именами в стандартной библиотеке.
Кроме того, импорты в Python регистрозависимы: import Spam и import spam — разные вещи.
Функцию pkgutil.iter_modules() (Python 2 и Python 3) можно использовать, чтобы получить список всех модулей, которые можно импортировать из заданного пути:
Чуть подробнее о sys.path
Документация Python описывает sys.path так:
Список строк, указывающих пути для поиска модулей. Инициализируется из переменной окружения PYTHONPATH и директории по умолчанию, которая зависит от дистрибутива Python.
Документация к интерфейсу командной строки Python добавляет информацию о запуске скриптов из командной строки. В частности, при запуске python
Как работает __init__.py?
The __init__.py files are required to make Python treat the directories as containing packages; this is done to prevent directories with a common name, such as string, from unintentionally hiding valid modules that occur later on the module search path
Допустим, в одном каталоге из sys.path есть папка package1. Его структура:
Простой 4 комментария
1. создай каталог sys рядом со скриптом,
потом импортируй sys
работает?
2. добавь в каталог sys/__init__.py
потом импортируй sys
работает?
Именно для того, чтобы каталог с файлами внезапно стал модулем требуется не совсем обычное действие.
PrAw, а в чем логика не импортировать свой пакет sys без init, если я создал его и переместил в папку с пакетами?
Какая была логика создания init.py? Это по типу «А что если юзер создаст свой пакет sys, переместит его в одну из директорий sys.path, но не захочет его использовать. Сделаем так, чтобы пакеты без init не импортировались, если пакет с таким же именем и init есть»? Только для таких случаев был создан init?
Грубо говоря, мне непонятно вот что:
1) Почему питон сам не может идентифицировать и импортировать пакет без init, если:
a) Папка содержит модули
b) Папка находится в нужной директории из sys.path
c) Папка имеет то же имя, что и я ввожу
Я уверен, что это легко могло быть реализовано, но не сделано из-за каких-то нюансов. Каких? Для включения\отключения каких-то дублей?
2) Если я создал пакет с таким же именем, что уже встроен в Питон, переместил его в нужную директорию, то очевидно я хочу его использовать? Иначе зачем я его создавал и перемещал, куда надо? Если я не хочу использовать пакет с таким же именем, то я его просто удалю из виртуальной среды?
Если в папке нет __init__.py то это не пакет.
Грубо говоря, __init__.py нужен для того что бы можно было загружать именно пакет и модель работы пакетов функционировала.
Для чего нужен __init__.py?
Для чего __init__.py в исходном каталоге Python?
10 ответов
Файл __init__.py позволяет Python обрабатывать каталоги, содержащие его, как модули.
Кроме того, это первый файл, который будет загружен в модуль, поэтому вы можете использовать его для выполнения кода, который вы хотите запускать каждый раз при загрузке модуля, или указывать субмодули для экспорта.
Это облегчает импорт других файлов Python. Когда вы помещаете этот файл в каталог (скажем, вещи), содержащий другие файлы py, вы можете сделать что-то вроде импорта stuff.other.
Без этого __init__.py внутри содержимого каталога вы не сможете импортировать other.py, потому что Python не знает, где находится исходный код материала, и не может распознать его как пакет.
__init__.py будет рассматривать каталог, в котором он находится, как загружаемый модуль.
Для людей, которые предпочитают читать код, я разместил комментарий двухбитного алхимика здесь.
Пример
Вот пример из одного из моих проектов, в котором я часто импортирую sessionmaker с именем Session для взаимодействия с моей базой данных. Я написал пакет базы данных с несколькими модулями:
Мой __init__.py содержит следующий код:
Поскольку я определяю Session здесь, я могу начать новый сеанс, используя синтаксис ниже. Этот код будет одинаково выполняться изнутри или снаружи каталога пакета «база данных».
Дальнейшее чтение
Здесь есть довольно интересный поток reddit, рассказывающий о соответствующих применениях __init__.py :
Похоже, что большинство считает, что __init__.py файлы должны быть очень тонкими, чтобы не нарушать философию «явный лучше, чем неявный».
Файл __init__.py упрощает импорт. Когда __init__.py присутствует в пакете, функцию a() можно импортировать из файла b.py следующим образом:
Без этого, однако, вы не можете импортировать напрямую. Вы должны изменить системный путь:
В Python определение пакета очень просто. Как и в Java, иерархическая структура и структура каталогов одинаковы. Но вы должны иметь __init__.py в пакете. Я объясню файл __init__.py следующим примером:
__init__.py может быть пустым, если он существует. Это указывает на то, что каталог следует рассматривать как пакет. Конечно, __init__.py также может установить соответствующий контент.
Если мы добавим функцию в module_n1:
Затем мы последовали за пакетом иерархии и назвали module_n1 функцией. Мы можем использовать __init__.py в subPackage_b следующим образом:
Файлы с именем __init__.py используются для пометки каталогов на диске как каталогов пакетов Python. Если у вас есть файлы
И mydir находится на вашем пути, вы можете импортировать код в module.py как
Файл __init__.py обычно пуст, но его можно использовать для экспорта выбранных частей пакета под более удобным именем, хранения вспомогательных функций и т. Д. Учитывая приведенный выше пример, к содержимому модуля init можно получить доступ как
Он указывает, что пакет должен рассматриваться как модуль, поэтому включайте его (даже если он пуст).
В некоторых случаях вы можете использовать __init__.py файл:
Представьте, что у вас была следующая файловая структура:
И methods.py содержал это:
Это работает, потому что __init__.py рассматривается как часть пакета.
Некоторые пакеты Python действительно делают это. Примером может служить JSON, где запущенный import json фактически импортирует <
Исходный код: Lib/json/__init__.py
Начиная с Python 3.3, __init__.py больше не требуется для определения каталогов как импортируемых пакетов Python.
Встроенная поддержка каталогов пакетов, для которых не требуются файлы маркеров __init__.py и которые могут автоматически охватывать несколько сегментов пути (вдохновленные различными сторонними подходами к пакетам пространства имен, как описано в PEP 420)
Для чего нужен __init__.py?
Что такое __init__.py для исходного каталога Python?
10 ответов
Файлы с именем __init__.py используются для маркировки каталогов на диске в виде каталогов пакетов Python. Если у вас есть файлы
и mydir находится на вашем пути, вы можете импортировать код в module.py как
Файл __init__.py обычно пуст, но может использоваться для экспорта выбранных частей пакета под более удобным именем, удержания функций удобства и т.д. В приведенном выше примере содержимое модуля init можно получить как
Пример
Вот пример из одного из моих проектов, в котором я часто импортирую sessionmaker под названием Session для взаимодействия с моей базой данных. Я написал пакет «database» с несколькими модулями:
My __init__.py содержит следующий код:
Так как я определяю Session здесь, я могу начать новый сеанс, используя синтаксис ниже. Этот код был бы таким же выполненным изнутри или вне каталога пакета базы данных.
Дальнейшее чтение
Существует довольно интересная красноватая нить, охватывающая соответствующие применения __init__.py здесь:
По мнению большинства, файлы __init__.py должны быть очень тонкими, чтобы не нарушать «явную, лучше неявную» философию.
Есть две основные причины для __init__.py
Для удобства: другим пользователям не нужно знать точное местоположение ваших функций в иерархии пакетов.
то другие могут вызвать add() на
без знания файла1, например
Если вы хотите, чтобы что-то было инициализировано; например, каротаж (который должен быть помещен на верхний уровень):
Файл __init__.py позволяет каталогам Python обрабатывать их как модули.
Кроме того, это первый файл, который нужно загрузить в модуле, поэтому вы можете использовать его для выполнения кода, который вы хотите запускать каждый раз при загрузке модуля, или указать подмодули, которые будут экспортированы.
В Python определение пакета очень просто. Подобно Java, иерархическая структура и структура каталогов одинаковы. Но вы должны иметь __init__.py в пакете. Я объясню файл __init__.py следующим примером:
__init__.py может быть пустым, если он существует. Он указывает, что каталог следует рассматривать как пакет. Конечно, __init__.py также может установить соответствующий контент.
Если мы добавим функцию в module_n1:
Затем мы выполнили пакет иерархии и вызвали функцию module_n1. Мы можем использовать __init__.py в subPackage_b следующим образом:
Следовательно, используя * importing, пакет модулей подчиняется __init__.py контенту.
Так как Python 3.3, __init__.py больше не требуется определять каталоги как импортируемые пакеты Python.
__init__.py будет обрабатывать каталог, в котором он находится в качестве загружаемого модуля.
Для людей, которые предпочитают читать код, я помещаю комментарий Двубичный алхимик.
Он облегчает импорт других файлов python. Когда вы помещаете этот файл в каталог (например, материал), содержащий другие файлы py, вы можете сделать что-то вроде import stuff.other.
Без этого __init__.py внутри содержимого каталога вы не можете импортировать файл other.py, потому что Python не знает, где исходный код для материала и не может распознать его как пакет.
Что такое __init__.py, используемый для?
Как вы можете видеть в структуре выше включение файла __init__.py в каталог указывает интерпретатору Python, что каталог должен рассматриваться как пакет Python
__init__.py может быть пустым файлом, но часто используется для выполнения настройки, необходимой для пакета (импортировать вещи, загружать вещи в путь и т.д.).
В вашем __init__.py есть одна общая задача: импортировать выбранные классы, функции и т.д. на уровень пакета, чтобы их можно было импортировать из пакета.
В приведенном выше примере мы можем сказать, что file.py имеет файл класса. Таким образом, без чего-либо в нашем __init__.py вы импортируете этот синтаксис:
он импортирует подмодуль1 и подмодуль2.
Как вы можете видеть, __init__.py может быть очень полезен, кроме его основной функции, указывая, что каталог является модулем.
Что init.py для?
что это __init__.py для исходного каталога Python?
11 ответов
файлы с именем __init__.py используются для пометки каталогов на диске как каталогов пакетов Python. Если у вас есть файлы
и mydir находится на вашем пути, вы можете импортировать код в module.py as
если убрать __init__.py file, Python больше не будет искать подмодули внутри этого каталога, поэтому попытки импортировать модуль завершатся неудачей.
на __init__.py файл обычно пуст, но может использоваться для экспортируйте выбранные части пакета под более удобным именем, удерживайте удобные функции и т. д. Учитывая приведенный выше пример, к содержимому модуля init можно получить доступ как
пример
вот пример из одного из моих проектов, в котором я часто импорт sessionmaker под названием Session для взаимодействия с базой данных. Я написал пакет «база данных» с несколькими модулями:
мой __init__.py содержащий следующий код:
так как я определяю Session здесь, я могу начать новый сеанс, используя синтаксис ниже. Этот код будет таким же, выполняемым изнутри или снаружи каталога пакета «база данных».
более дальнеишее чтение
существует довольно интересная нить reddit, охватывающая соответствующие использования __init__.py здесь:
мнение большинства, кажется, что __init__.py файлы должны быть очень тонкими, чтобы избежать нарушения философия» явное лучше, чем неявное».
есть 2 основные причины для __init__.py
для удобства: другим пользователям не нужно будет знать точное местоположение ваших функций в иерархии пакетов.
тогда другие могут вызвать add () по
если вы хотите, чтобы что-то было инициализировано; например, ведение журнала (который должен быть помещен на верхний уровень):
на __init__.py файл делает Python обрабатывать каталоги, содержащие его в качестве модулей.
кроме того, это первый файл, загружаемый в модуль, поэтому вы можете использовать его для выполнения кода, который вы хотите запускать каждый раз при загрузке модуля, или указать подмодули для экспорта.
Начиная С Python 3.3, __init__.py больше не требуется определять каталоги как импортируемые пакеты Python.
встроенная поддержка каталогов пакетов, которые не требуют __init__.py файлы маркеров и могут автоматически охватывать несколько сегментов пути (вдохновленные различными сторонними подходами к пакетам пространств имен, как описано в PEP 420)
в Python определение пакета очень проста. Как и Java, иерархическая структура и структура каталогов одинаковы. Но вы должны иметь __init__.py в пакете. Я объясню __init__.py файл с примером ниже:
__init__.py может быть пустым, пока оно существует. Это указывает на то, что каталог следует рассматривать как пакет. Конечно, __init__.py можно также установить соответствующий контент.
если мы добавим функцию в module_n1:
затем мы последовали за пакетом иерархии и назвали module_n1 функцией. Мы можем использовать __init__.py в subPackage_b вот так:
следовательно, используя * импорт, пакет модуля подлежит __init__.py содержание.
__init__.py будет рассматривать каталог, в котором он находится, как загружаемый модуль.
для людей, которые предпочитают читать код, я ставлю два-бит алхимика комментарий здесь.
что такое __init__.py используется для?
основное использование __init__.py для инициализации пакетов Python. Самый простой способ продемонстрировать это-взглянуть на структуру стандартного модуля Python.
как вы можете видеть в структуре выше включение __init__.py файл в каталоге указывает интерпретатору Python, что каталог должен рассматриваться как пакет Python
__init__.py может быть пустым файлом, но он часто используется для выполнения настройки, необходимой для пакета(импорт вещей, загрузка вещей в путь и т. д.).
одна общая вещь, котор нужно сделать в вашем __init__.py импортировать выбранные классы, функции и т. д. на уровень пакета, чтобы их можно было легко импортировать из пакета.
в примере выше мы можем сказать, что file.py имеет файл класса. Так что ничего в нашем __init__.py импортировать с этот синтаксис:
однако вы можете импортировать файл в свой __init__.py чтобы сделать его доступным на уровне пакета:
еще одна вещь, которую нужно сделать, это на уровне пакета сделать подпакеты / модули доступными с помощью __all__ переменной. Когда переводчиком видит __all__ переменная, определенная в __init__.py он импортирует модули, перечисленные в __all__ переменной, когда вы делаете:
С __all__ переменная заполняется так, когда вы выполняете
он будет импортировать submodule1 и submodule2.
Как видите, __init__.py может быть очень полезно, кроме его основной функции указания, что каталог является модуль.
это облегчает импорт других файлов python. Когда вы разместили этот файл в каталоге (скажем, материал), содержащем другие файлы py, вы можете сделать что-то вроде импорта материала.другой.
без этого __init__.py внутри материала каталога вы не можете импортировать other.py, потому что Python не знает, где находится исходный код для материала, и не может распознать его как пакет.
хотя Python работает без __init__.py файл, который вы все равно должны включить.
он указывает, что пакет должен рассматриваться как модуль, поэтому включите его (даже если он пуст).
существует также случай, когда вы можете использовать :
представьте, что у вас есть следующая структура файлов:
использовать foo() вам понадобится одно из следующих действий:
это работает, потому что __init__.py рассматривается как часть пакета.
некоторые пакеты Python действительно делают это. Пример с JSON, где работает import json фактически импорта __init__.py С json пакета (смотрите файловую структуру пакета здесь):
исходный код: Lib/json/__init__.py