Архив рубрики: Модули

Основы операции импортирования пакетов

До сих пор, импортируя модули, мы загружали файлы. Это типичный способ использования модулей и, скорее всего, этот прием будет вами использоваться наиболее часто в начале вашей карьеры программиста на языке Python. Однако возможности импортирования модулей немного богаче, чем я предлагал вам считать до настоящего момента. 
Помимо возможности импортировать имя модуля существует возможность импортировать имена каталогов. Каталог на языке Python называется пакетом, поэтому такая операция импортирования называется импортированием пакетов. В действительности, операция импортирования пакета превращает имя каталога в еще одну разновидность пространства имен, в котором атрибутам соответствуют подкаталоги и файлы модулей, находящиеся в этих каталогах.

Так как же выполняется импортирование пакетов? В инструкциях import, там, где вы указывали имя простого файла, можно указать список имен в пути к каталогу, разделяя их символами точки:
import dir1.dir2.mod
То же самое относится и к инструкции from:
from dir1.dir2.mod import x
Предполагается, что такой «точечный» путь в этих инструкциях соответствует пути через иерархию каталогов на вашей машине, ведущему к файлу mod.py (или к файлу с похожим именем – расширение в имени файла может быть другим). Таким образом, предыдущие инструкции указывают, что на вашей машине имеется каталог dir1, в котором существует подкаталог dir2, в котором находится файл модуля mod.py (или с похожим именем).
Кроме того, эти инструкции предполагают, что каталог dir1 находится внутри некоторого контейнерного  каталога  dir0,  который  находится  в  пути  поиска модулей. Другими словами, обе инструкции импорта предполагают наличие структуры  каталогов,  которая  выглядит  примерно  так,  как  показано  ниже (здесь в качестве разделителей имен каталогов используется символ обратного слеша, принятый в операционной системе DOS): dir0dir1dir2mod.py  # Или mod.pyc, mod.so и так далее
Контейнерный каталог dir0 должен быть добавлен в путь поиска модулей (если это не домашний каталог главного файла программы), как если бы имя dir1 было именем модуля. Инструкция import в вашем сценарии определяет пути, ведущие непосредственно к модулям, начиная от этого каталога.
В  любом  случае  самый  левый  компонент  пути  в  операции  импортирования пакета вычисляется относительно некоторого каталога, включенного в путь поиска модулей, – в список sys.path
То есть инструкции import в вашем сценарии должны содержать полный путь 
к импортируемым модулям относительно этого каталога.

Автор: Няшный Человек
Дата публикации: 2015-12-15T22:28:00.000+02:00

Основы использования функции reload

В отличие от инструкций import и from:
•  reload – это не инструкция, а функция.
•  Функции reload передается существующий объект модуля, а не имя.
•  В Python 3.0 функции reload находится в модуле imp, который требуется импортировать, чтобы получить доступ к функции. Функция reload ожидает получить объект, поэтому к моменту ее вызова модуль уже должен быть успешно импортирован (если операция импорта оказалась неудачной из-за синтаксических или каких-либо других ошибок, вам может потребоваться повторить ее, прежде чем можно будет повторно загрузить модуль).

Кроме того, синтаксис инструкции import и функции reload отличается: аргумент должен передаваться функции reload в круглых скобках, а инструкции import – без них. Повторная загрузка модуля выполняется примерно следующим образом:
import module                  # Первоначальное импортирование
…используются атрибуты модуля…
…                            # Теперь выполняются изменения в файле модуля

from imp import reload         # Импортировать функцию reload (в 3.0)
reload(module)                 # Загрузить обновленный модуль
…используются атрибуты модуля…
Это типичный случай, когда вы импортируете модуль, затем изменяете исходный программный код в текстовом редакторе, а потом повторно загружаете его. Когда вы вызываете функцию reload, интерпретатор повторно читает файл с  исходными  текстами  и  выполняет  инструкции,  находящиеся  на  верхнем уровне. Пожалуй, самое важное, что следует знать о функции reload, – это то, что она изменяет непосредственно сам объект модуля – она не удаляет и не создает его повторно. Вследствие этого все ссылки на объект модуля, имеющиеся в программе, автоматически будут учитывать изменения, произошедшие в результате повторной загрузки. А теперь подробнее о том, как происходит повторная загрузка:
•  Функция reload запускает новый программный код в файле модуля в текущем пространстве имен модуля. При повторном выполнении программный код перезаписывает существующее пространство имен вместо того, чтобы удалять его и создавать вновь.
•  Инструкции присваивания на верхнем уровне файла замещают имена новыми значениями. Например, повторный запуск инструкции def приводит к замещению предыдущей версии функции в пространстве имен модуля, выполняя повторную операцию присваивания имени функции.
•  Повторная загрузка оказывает воздействие на всех клиентов, использовавших инструкцию import для получения доступа к модулю. Клиенты, использовавшие инструкцию import, получают доступ к атрибутам модуля, указывая полные их имена, поэтому после повторной загрузки они будут получать новые значения атрибутов.
•  Повторная загрузка будет воздействовать лишь на тех клиентов, которые еще только будут использовать инструкцию from в будущем. Клиенты, которые использовали инструкцию from для получения доступа к атрибутам в прошлом, не заметят изменений, произошедших в результате повторной загрузки, – они по-прежнему будут ссылаться на старые объекты, полученные до выполнения перезагрузки.

Автор: Няшный Человек
Дата публикации: 2015-11-21T16:54:00.000+02:00